mirror of
https://github.com/simonw/sqlite-utils.git
synced 2026-07-25 18:34:32 +02:00
Add self-referential FK support and additional tests
- Fix transform_sql to update other_column for self-referential FKs when the referenced column is being renamed - Skip FK validation during transform when update_incoming_fks=True since self-referential FKs temporarily reference non-existent columns - Add tests for multiple tables referencing renamed column - Add test for self-referential FK handling
This commit is contained in:
parent
23bc93239e
commit
e22b34ee24
2 changed files with 128 additions and 13 deletions
|
|
@ -1944,19 +1944,29 @@ class Table(Queryable):
|
|||
finally:
|
||||
self.db._skip_fk_validation = False
|
||||
|
||||
sqls = self.transform_sql(
|
||||
types=types,
|
||||
rename=rename,
|
||||
drop=drop,
|
||||
pk=pk,
|
||||
not_null=not_null,
|
||||
defaults=defaults,
|
||||
drop_foreign_keys=drop_foreign_keys,
|
||||
add_foreign_keys=add_foreign_keys,
|
||||
foreign_keys=foreign_keys,
|
||||
column_order=column_order,
|
||||
keep_table=keep_table,
|
||||
)
|
||||
# Skip FK validation for main transform if update_incoming_fks is True
|
||||
# because self-referential FKs will reference the new column name
|
||||
# that only exists after the transform completes
|
||||
if update_incoming_fks and rename:
|
||||
self.db._skip_fk_validation = True
|
||||
try:
|
||||
sqls = self.transform_sql(
|
||||
types=types,
|
||||
rename=rename,
|
||||
drop=drop,
|
||||
pk=pk,
|
||||
not_null=not_null,
|
||||
defaults=defaults,
|
||||
drop_foreign_keys=drop_foreign_keys,
|
||||
add_foreign_keys=add_foreign_keys,
|
||||
foreign_keys=foreign_keys,
|
||||
column_order=column_order,
|
||||
keep_table=keep_table,
|
||||
)
|
||||
finally:
|
||||
if update_incoming_fks and rename:
|
||||
self.db._skip_fk_validation = False
|
||||
|
||||
pragma_foreign_keys_was_on = self.db.execute("PRAGMA foreign_keys").fetchone()[
|
||||
0
|
||||
]
|
||||
|
|
@ -2034,6 +2044,9 @@ class Table(Queryable):
|
|||
for table, column, other_table, other_column in self.foreign_keys:
|
||||
# Copy over old foreign keys, unless we are dropping them
|
||||
if (drop_foreign_keys is None) or (column not in drop_foreign_keys):
|
||||
# For self-referential FKs, also update the referenced column if renamed
|
||||
if other_table == self.name:
|
||||
other_column = rename.get(other_column) or other_column
|
||||
create_table_foreign_keys.append(
|
||||
ForeignKey(
|
||||
table,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue