Skip to content

Commit 9c99990

Browse files
committed
1 parent c827b96 commit 9c99990

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

sql_server/pyodbc/features.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
2121
supports_index_on_text_field = False
2222
supports_nullable_unique_constraints = False
2323
supports_paramstyle_pyformat = False
24-
supports_partially_nullable_unique_constraints = False
2524
supports_regex_backreferencing = False
2625
supports_sequence_reset = False
2726
supports_subqueries_in_group_by = False

sql_server/pyodbc/schema.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
5252
sql_delete_table = "DROP TABLE %(table)s"
5353
sql_rename_column = "EXEC sp_rename '%(table)s.%(old_column)s', %(new_column)s, 'COLUMN'"
5454
sql_rename_table = "EXEC sp_rename %(old_table)s, %(new_table)s"
55+
sql_create_unique_null = "CREATE UNIQUE INDEX %(name)s ON %(table)s(%(columns)s) " \
56+
"WHERE %(columns)s IS NOT NULL"
5557

5658
def _alter_column_default_sql(self, model, old_field, new_field, drop=False):
5759
"""
@@ -320,7 +322,15 @@ def _alter_field(self, model, old_field, new_field, old_type, new_type,
320322
self._delete_primary_key(model, strict)
321323
# Added a unique?
322324
if self._unique_should_be_added(old_field, new_field):
323-
self.execute(self._create_unique_sql(model, [new_field.column]))
325+
if new_field.null:
326+
self.execute(
327+
self._create_index_sql(
328+
model, [new_field], sql=self.sql_create_unique_null, suffix="_uniq"
329+
)
330+
)
331+
else:
332+
self.execute(self._create_unique_sql(model, [new_field.column]))
333+
324334
# Added an index?
325335
# constraint will no longer be used in lieu of an index. The following
326336
# lines from the truth table show all True cases; the rest are False:
@@ -496,6 +506,11 @@ def add_field(self, model, field):
496506
# It might not actually have a column behind it
497507
if definition is None:
498508
return
509+
if field.null and field.unique:
510+
definition = definition.replace(' UNIQUE', '')
511+
self.deferred_sql.append(self._create_index_sql(
512+
model, [field], sql=self.sql_create_unique_null, suffix="_uniq"
513+
))
499514
# Check constraints can go on the column SQL here
500515
db_params = field.db_parameters(connection=self.connection)
501516
if db_params['check']:
@@ -538,6 +553,11 @@ def create_model(self, model):
538553
definition, extra_params = self.column_sql(model, field)
539554
if definition is None:
540555
continue
556+
if field.null and field.unique:
557+
definition = definition.replace(' UNIQUE', '')
558+
self.deferred_sql.append(self._create_index_sql(
559+
model, [field], sql=self.sql_create_unique_null, suffix="_uniq"
560+
))
541561
# Check constraints can go on the column SQL here
542562
db_params = field.db_parameters(connection=self.connection)
543563
if db_params['check']:

0 commit comments

Comments
 (0)