@@ -95,6 +95,16 @@ def __init__(self, **kwargs: tx.Unpack[MySQLtoSQLiteParams]) -> None:
95
95
else :
96
96
self ._without_foreign_keys = bool (kwargs .get ("without_foreign_keys" , False ))
97
97
98
+ if not self ._without_foreign_keys and not bool (self ._mysql_tables ) and not bool (self ._exclude_mysql_tables ):
99
+ self ._defer_foreign_keys = bool (kwargs .get ("defer_foreign_keys" , False ))
100
+ if self ._defer_foreign_keys and sqlite3 .sqlite_version_info < (3 , 6 , 19 ):
101
+ self ._logger .warning (
102
+ "SQLite %s lacks DEFERRABLE support – ignoring --defer-fks." , sqlite3 .sqlite_version
103
+ )
104
+ self ._defer_foreign_keys = False
105
+ else :
106
+ self ._defer_foreign_keys = False
107
+
98
108
self ._without_data = bool (kwargs .get ("without_data" , False ))
99
109
self ._without_tables = bool (kwargs .get ("without_tables" , False ))
100
110
@@ -557,10 +567,12 @@ def _build_create_table_sql(self, table_name: str) -> str:
557
567
)
558
568
for foreign_key in self ._mysql_cur_dict .fetchall ():
559
569
if foreign_key is not None :
570
+ deferrable_clause = " DEFERRABLE INITIALLY DEFERRED" if self ._defer_foreign_keys else ""
560
571
sql += (
561
572
',\n \t FOREIGN KEY("{column}") REFERENCES "{ref_table}" ("{ref_column}") '
562
573
"ON UPDATE {on_update} "
563
- "ON DELETE {on_delete}" .format (** foreign_key ) # type: ignore[str-bytes-safe]
574
+ "ON DELETE {on_delete}"
575
+ "{deferrable}" .format (** foreign_key , deferrable = deferrable_clause ) # type: ignore[str-bytes-safe]
564
576
)
565
577
566
578
sql += "\n );"
@@ -765,12 +777,15 @@ def transfer(self) -> None:
765
777
self ._logger .warning (
766
778
"Foreign key constraint violations found (%d violation%s):" ,
767
779
len (fk_violations ),
768
- "s" if len (fk_violations ) != 1 else ""
780
+ "s" if len (fk_violations ) != 1 else "" ,
769
781
)
770
782
for violation in fk_violations :
771
783
self ._logger .warning (
772
784
" → Table '%s' (row %s) references missing key in '%s' (constraint #%s)" ,
773
- violation [0 ], violation [1 ], violation [2 ], violation [3 ]
785
+ violation [0 ],
786
+ violation [1 ],
787
+ violation [2 ],
788
+ violation [3 ],
774
789
)
775
790
else :
776
791
self ._logger .info ("All foreign key constraints are valid." )
0 commit comments