From bba6e241be0e4aa596da0d5d4ae787d9d4cde92e Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Thu, 25 Feb 2021 09:11:37 -0800 Subject: [PATCH] --ignore for sqlite-utils drop-table and drop-view, closes #237 --- docs/cli.rst | 4 ++++ sqlite_utils/cli.py | 18 ++++++++++-------- tests/test_cli.py | 23 ++++++++++++++++++++++- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/docs/cli.rst b/docs/cli.rst index c015d78..8a049a6 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -736,6 +736,8 @@ You can drop a table using the ``drop-table`` command:: $ sqlite-utils drop-table mydb.db mytable +Use ``--ignore`` to ignore the error if the table does not exist. + .. _cli_transform_table: Transforming tables @@ -922,6 +924,8 @@ You can drop a view using the ``drop-view`` command:: $ sqlite-utils drop-view myview +Use ``--ignore`` to ignore the error if the view does not exist. + .. _cli_add_column: Adding columns diff --git a/sqlite_utils/cli.py b/sqlite_utils/cli.py index 4b51565..c5cbadf 100644 --- a/sqlite_utils/cli.py +++ b/sqlite_utils/cli.py @@ -946,14 +946,15 @@ def create_table( required=True, ) @click.argument("table") +@click.option("--ignore", is_flag=True) @load_extension_option -def drop_table(path, table, load_extension): +def drop_table(path, table, ignore, load_extension): "Drop the specified table" db = sqlite_utils.Database(path) _load_extensions(db, load_extension) - if table in db.table_names(): - db[table].drop() - else: + try: + db[table].drop(ignore=ignore) + except sqlite3.OperationalError: raise click.ClickException('Table "{}" does not exist'.format(table)) @@ -1002,14 +1003,15 @@ def create_view(path, view, select, ignore, replace, load_extension): required=True, ) @click.argument("view") +@click.option("--ignore", is_flag=True) @load_extension_option -def drop_view(path, view, load_extension): +def drop_view(path, view, ignore, load_extension): "Drop the specified view" db = sqlite_utils.Database(path) _load_extensions(db, load_extension) - if view in db.view_names(): - db[view].drop() - else: + try: + db[view].drop(ignore=ignore) + except sqlite3.OperationalError: raise click.ClickException('View "{}" does not exist'.format(view)) diff --git a/tests/test_cli.py b/tests/test_cli.py index b9d5246..0be2594 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1397,7 +1397,17 @@ def test_drop_table_error(): ) assert 1 == result.exit_code assert 'Error: Table "t2" does not exist' == result.output.strip() - + # Using --ignore supresses that error + result = runner.invoke( + cli.cli, + [ + "drop-table", + "test.db", + "t2", + "--ignore" + ], + ) + assert 0 == result.exit_code def test_drop_view(): runner = CliRunner() @@ -1432,6 +1442,17 @@ def test_drop_view_error(): ) assert 1 == result.exit_code assert 'Error: View "t2" does not exist' == result.output.strip() + # Using --ignore supresses that error + result = runner.invoke( + cli.cli, + [ + "drop-view", + "test.db", + "t2", + "--ignore" + ], + ) + assert 0 == result.exit_code def test_enable_wal():