diff --git a/docs/cli.rst b/docs/cli.rst index c05f05d..bdd10a3 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -592,7 +592,7 @@ Every option for this table (with the exception of ``--pk-none``) can be specifi ``--default-none column`` Remove the default value for this column. -``--drop-foreign-key col other_table other_column`` +``--drop-foreign-key column`` Drop the specified foreign key. If you want to see the SQL that will be executed to make the change without actually executing it, add the ``--sql`` flag. For example:: diff --git a/docs/python-api.rst b/docs/python-api.rst index b2452d7..b0aabf9 100644 --- a/docs/python-api.rst +++ b/docs/python-api.rst @@ -995,17 +995,14 @@ The ``column_order=`` parameter can be used to change the order of the columns. # Change column order table.transform(column_order=("name", "age", "id") -You can use ``.transform()`` to remove foreign key constraints from a table. You will need to know the name of the column, the name of the table it points to and the name of the column it references on that other table. +You can use ``.transform()`` to remove foreign key constraints from a table. This example drops two foreign keys - the one from ``places.country`` to ``country.id`` and the one from ``places.continent`` to ``continent.id``: .. code-block:: python db["places"].transform( - drop_foreign_keys=( - ("country", "country", "id"), - ("continent", "continent", "id"), - ) + drop_foreign_keys=("country", "continent") ) .. _python_api_transform_sql: diff --git a/sqlite_utils/cli.py b/sqlite_utils/cli.py index 535d3d0..56dc0c8 100644 --- a/sqlite_utils/cli.py +++ b/sqlite_utils/cli.py @@ -924,7 +924,7 @@ def rows(ctx, path, dbtable, nl, arrays, csv, no_headers, table, fmt, json_cols) ) @click.option( "--drop-foreign-key", - type=(str, str, str), + type=str, multiple=True, help="Drop this foreign key constraint", ) diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index f5868ed..178d48b 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -835,9 +835,7 @@ class Table(Queryable): # foreign_keys create_table_foreign_keys = [] for table, column, other_table, other_column in self.foreign_keys: - if (drop_foreign_keys is None) or ( - (column, other_table, other_column) not in drop_foreign_keys - ): + if (drop_foreign_keys is None) or (column not in drop_foreign_keys): create_table_foreign_keys.append( (rename.get(column) or column, other_table, other_column) ) diff --git a/tests/test_cli.py b/tests/test_cli.py index 5aad909..c50f87f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1542,8 +1542,6 @@ def test_transform_drop_foreign_key(db_path): "places", "--drop-foreign-key", "country", - "country", - "id", ], ) print(result.output) diff --git a/tests/test_transform.py b/tests/test_transform.py index a96f9ba..b3ef009 100644 --- a/tests/test_transform.py +++ b/tests/test_transform.py @@ -274,12 +274,7 @@ def test_transform_drop_foreign_keys(fresh_db, use_pragma_foreign_keys): ), ] # Drop two of those foreign keys - fresh_db["places"].transform( - drop_foreign_keys=( - ("country", "country", "id"), - ("continent", "continent", "id"), - ) - ) + fresh_db["places"].transform(drop_foreign_keys=("country", "continent")) # Should be only one foreign key now assert fresh_db["places"].foreign_keys == [ ForeignKey(table="places", column="city", other_table="city", other_column="id")