Skip to content

Commit e98f399

Browse files
committed
Fix errors when drop table using sql queries
1 parent b81a024 commit e98f399

File tree

1 file changed

+17
-37
lines changed

1 file changed

+17
-37
lines changed

sql_server/pyodbc/schema.py

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,6 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
4343
"WHERE" \
4444
" t.name = %(table)s AND" \
4545
" c.name = %(column)s"
46-
_sql_select_foreign_key_constraints = "SELECT" \
47-
" po.name AS table_name," \
48-
" co.name AS constraint_name " \
49-
"FROM sys.foreign_key_columns fkc " \
50-
"INNER JOIN sys.objects co ON" \
51-
" fkc.constraint_object_id = co.object_id " \
52-
"INNER JOIN sys.tables po ON" \
53-
" fkc.parent_object_id = po.object_id " \
54-
"INNER JOIN sys.tables ro ON" \
55-
" fkc.referenced_object_id = ro.object_id " \
56-
"WHERE ro.name = %(table)s"
5746
sql_alter_column_default = "ADD DEFAULT %(default)s FOR %(column)s"
5847
sql_alter_column_no_default = "DROP CONSTRAINT %(column)s"
5948
sql_alter_column_not_null = "ALTER COLUMN %(column)s %(type)s NOT NULL"
@@ -62,7 +51,23 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
6251
sql_create_column = "ALTER TABLE %(table)s ADD %(column)s %(definition)s"
6352
sql_delete_column = "ALTER TABLE %(table)s DROP COLUMN %(column)s"
6453
sql_delete_index = "DROP INDEX %(name)s ON %(table)s"
65-
sql_delete_table = "DROP TABLE %(table)s"
54+
sql_delete_table = """
55+
DECLARE @sql_drop_constraint nvarchar(255)
56+
SELECT @sql_drop_constraint = name
57+
FROM sys.foreign_keys
58+
WHERE referenced_object_id = object_id('%(table)s')
59+
IF @sql_drop_constraint IS NOT NULL
60+
BEGIN
61+
SELECT
62+
@sql_drop_constraint = 'ALTER TABLE [' + OBJECT_NAME(parent_object_id) + '] ' +
63+
'DROP CONSTRAINT [' + @sql_drop_constraint + '] '
64+
FROM sys.foreign_keys
65+
WHERE referenced_object_id = object_id('%(table)s')
66+
print(@sql_drop_constraint)
67+
exec sp_executesql @sql_drop_constraint
68+
END
69+
DROP TABLE %(table)s
70+
"""
6671
sql_rename_column = "EXEC sp_rename '%(table)s.%(old_column)s', %(new_column)s, 'COLUMN'"
6772
sql_rename_table = "EXEC sp_rename %(old_table)s, %(new_table)s"
6873
sql_create_unique_null = "CREATE UNIQUE INDEX %(name)s ON %(table)s(%(columns)s) " \
@@ -818,32 +823,7 @@ def create_model(self, model):
818823
self.create_model(field.remote_field.through)
819824

820825
def delete_model(self, model):
821-
"""
822-
Deletes a model from the database.
823-
"""
824-
# Delete the foreign key constraints
825-
result = self.execute(
826-
self._sql_select_foreign_key_constraints % {
827-
"table": self.quote_value(model._meta.db_table),
828-
},
829-
has_result=True
830-
)
831-
if result:
832-
for table, constraint in result:
833-
sql = self.sql_alter_column % {
834-
"table": self.quote_name(table),
835-
"changes": self.sql_alter_column_no_default % {
836-
"column": self.quote_name(constraint),
837-
}
838-
}
839-
self.execute(sql)
840-
841-
# Delete the table
842826
super().delete_model(model)
843-
# Remove all deferred statements referencing the deleted table.
844-
for sql in list(self.deferred_sql):
845-
if isinstance(sql, Statement) and sql.references_table(model._meta.db_table):
846-
self.deferred_sql.remove(sql)
847827

848828
def execute(self, sql, params=(), has_result=False):
849829
"""

0 commit comments

Comments
 (0)