mirror of
https://github.com/simonw/sqlite-utils.git
synced 2026-09-28 04:44:26 +02:00
drop-table and drop-view now refuse to drop the wrong object type
drop-table on a view name silently dropped the view, and drop-view on a table name silently dropped the table, because both used db[name].drop() which dispatches on the actual object type. They now use db.table() / db.view() and exit with an explanatory error pointing at the correct command. --ignore still exits cleanly but no longer drops anything. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UnLnhsH25Nnv7LHhekUfPd
This commit is contained in:
parent
d36639ed73
commit
862944bc38
2 changed files with 51 additions and 3 deletions
|
|
@ -14,6 +14,7 @@ from sqlite_utils.db import (
|
||||||
DEFAULT,
|
DEFAULT,
|
||||||
DescIndex,
|
DescIndex,
|
||||||
NoTable,
|
NoTable,
|
||||||
|
NoView,
|
||||||
quote_identifier,
|
quote_identifier,
|
||||||
)
|
)
|
||||||
from sqlite_utils.plugins import ensure_plugins_loaded, pm, get_plugins
|
from sqlite_utils.plugins import ensure_plugins_loaded, pm, get_plugins
|
||||||
|
|
@ -1725,7 +1726,13 @@ def drop_table(path, table, ignore, load_extension):
|
||||||
_register_db_for_cleanup(db)
|
_register_db_for_cleanup(db)
|
||||||
_load_extensions(db, load_extension)
|
_load_extensions(db, load_extension)
|
||||||
try:
|
try:
|
||||||
db[table].drop(ignore=ignore)
|
db.table(table).drop(ignore=ignore)
|
||||||
|
except NoTable:
|
||||||
|
# A view exists with this name
|
||||||
|
if not ignore:
|
||||||
|
raise click.ClickException(
|
||||||
|
'"{}" is a view, not a table - use drop-view to drop it'.format(table)
|
||||||
|
)
|
||||||
except OperationalError:
|
except OperationalError:
|
||||||
raise click.ClickException('Table "{}" does not exist'.format(table))
|
raise click.ClickException('Table "{}" does not exist'.format(table))
|
||||||
|
|
||||||
|
|
@ -1797,8 +1804,14 @@ def drop_view(path, view, ignore, load_extension):
|
||||||
_register_db_for_cleanup(db)
|
_register_db_for_cleanup(db)
|
||||||
_load_extensions(db, load_extension)
|
_load_extensions(db, load_extension)
|
||||||
try:
|
try:
|
||||||
db[view].drop(ignore=ignore)
|
db.view(view).drop(ignore=ignore)
|
||||||
except OperationalError:
|
except NoView:
|
||||||
|
if ignore:
|
||||||
|
return
|
||||||
|
if view in db.table_names():
|
||||||
|
raise click.ClickException(
|
||||||
|
'"{}" is a table, not a view - use drop-table to drop it'.format(view)
|
||||||
|
)
|
||||||
raise click.ClickException('View "{}" does not exist'.format(view))
|
raise click.ClickException('View "{}" does not exist'.format(view))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1467,6 +1467,24 @@ def test_drop_table_error():
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_drop_table_on_view_errors():
|
||||||
|
runner = CliRunner()
|
||||||
|
with runner.isolated_filesystem():
|
||||||
|
db = Database("test.db")
|
||||||
|
db["t"].insert({"id": 1})
|
||||||
|
db.create_view("v", "select * from t")
|
||||||
|
result = runner.invoke(cli.cli, ["drop-table", "test.db", "v"])
|
||||||
|
assert result.exit_code == 1
|
||||||
|
assert 'Error: "v" is a view, not a table - use drop-view to drop it' == (
|
||||||
|
result.output.strip()
|
||||||
|
)
|
||||||
|
assert "v" in db.view_names()
|
||||||
|
# --ignore exits cleanly but must still not drop the view
|
||||||
|
result = runner.invoke(cli.cli, ["drop-table", "test.db", "v", "--ignore"])
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert "v" in db.view_names()
|
||||||
|
|
||||||
|
|
||||||
def test_drop_view():
|
def test_drop_view():
|
||||||
runner = CliRunner()
|
runner = CliRunner()
|
||||||
with runner.isolated_filesystem():
|
with runner.isolated_filesystem():
|
||||||
|
|
@ -1485,6 +1503,23 @@ def test_drop_view():
|
||||||
assert "hello" not in db.view_names()
|
assert "hello" not in db.view_names()
|
||||||
|
|
||||||
|
|
||||||
|
def test_drop_view_on_table_errors():
|
||||||
|
runner = CliRunner()
|
||||||
|
with runner.isolated_filesystem():
|
||||||
|
db = Database("test.db")
|
||||||
|
db["t"].insert({"id": 1})
|
||||||
|
result = runner.invoke(cli.cli, ["drop-view", "test.db", "t"])
|
||||||
|
assert result.exit_code == 1
|
||||||
|
assert 'Error: "t" is a table, not a view - use drop-table to drop it' == (
|
||||||
|
result.output.strip()
|
||||||
|
)
|
||||||
|
assert "t" in db.table_names()
|
||||||
|
# --ignore exits cleanly but must still not drop the table
|
||||||
|
result = runner.invoke(cli.cli, ["drop-view", "test.db", "t", "--ignore"])
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert "t" in db.table_names()
|
||||||
|
|
||||||
|
|
||||||
def test_drop_view_error():
|
def test_drop_view_error():
|
||||||
runner = CliRunner()
|
runner = CliRunner()
|
||||||
with runner.isolated_filesystem():
|
with runner.isolated_filesystem():
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue