Skip to content

Commit 15b308e

Browse files
author
Melvyn Sopacua
committed
fix(1.11): Drop defaults before removing field
Hand merge of michiya#38 : When removing columns make sure we remove defaults (which Microsoft has deemed to be constraints).
1 parent d950586 commit 15b308e

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

sql_server/pyodbc/introspection.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ def get_constraints(self, cursor, table_name):
302302
"foreign_key": (ref_table, ref_column) if kind.lower() == "foreign key" else None,
303303
"check": False,
304304
"index": False,
305+
"default": False,
305306
}
306307
# Record the details
307308
constraints[constraint]['columns'].append(column)
@@ -328,6 +329,7 @@ def get_constraints(self, cursor, table_name):
328329
"foreign_key": None,
329330
"check": True,
330331
"index": False,
332+
"default": False,
331333
}
332334
# Record the details
333335
constraints[constraint]['columns'].append(column)
@@ -370,6 +372,7 @@ def get_constraints(self, cursor, table_name):
370372
"foreign_key": None,
371373
"check": False,
372374
"index": True,
375+
"default": False,
373376
"orders": [],
374377
"type": Index.suffix if type_ in (1,2) else desc.lower(),
375378
}
@@ -378,4 +381,26 @@ def get_constraints(self, cursor, table_name):
378381
for index, constraint in indexes.items():
379382
if index not in constraints:
380383
constraints[index] = constraint
384+
# Now get DEFAULT constraint columns
385+
cursor.execute("""
386+
SELECT
387+
[name],
388+
COL_NAME([parent_object_id], [parent_column_id])
389+
FROM
390+
[sys].[default_contraints]
391+
WHERE
392+
OBJECT_NAME([parent_object_id]) = %s
393+
""", [table_name])
394+
for constraint, column in cursor.fetchall():
395+
if constraint not in constraints:
396+
constraints[constraint] = {
397+
"columns": [],
398+
"primary_key": False,
399+
"unique": False,
400+
"foreign_key": None,
401+
"check": False,
402+
"index": False,
403+
"default": True,
404+
}
405+
constraints[constraint]['columns'].append(column)
381406
return constraints

sql_server/pyodbc/schema.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
)
77
from django.db.models import Index
88
from django.db.models.fields import AutoField, BigAutoField
9-
from django.db.models.fields.related import ManyToManyField
109
from django.db.transaction import TransactionManagementError
1110
from django.utils import six
1211
from django.utils.text import force_text
@@ -716,6 +715,18 @@ def remove_field(self, model, field):
716715
"table": self.quote_name(model._meta.db_table),
717716
"name": self.quote_name(name),
718717
})
718+
# Drop default constraints, SQL Server treats defaults as constraints requiring explicit
719+
# deletion.
720+
for name, infodict in constraints.items():
721+
if field.column in infodict['columns'] and infodict['default']:
722+
self.execute(
723+
self.sql_alter_column % {
724+
"table": self.quote_name(model._meta.db_table),
725+
"changes": self.sql_alter_column_no_default % {
726+
"column": self.quote_name(name)
727+
}
728+
}
729+
)
719730
# Delete the column
720731
sql = self.sql_delete_column % {
721732
"table": self.quote_name(model._meta.db_table),

0 commit comments

Comments
 (0)