Skip to content

Commit 4883a50

Browse files
committed
Accept deferrable kwarg for schema editor SQL
This follows Django 3.1.x's lead in adding `deferrable` as a keyword argument to the `_create_unique_sql` function, following their implementation in the schema editor object. Without accepting this keyword arg, migrations will crash like so: ``` ... File "lib/python3.8/site-packages/django/db/backends/base/schema.py", line 360, in add_constraint sql = constraint.create_sql(model, self) File "lib/python3.8/site-packages/django/db/models/constraints.py", line 118, in create_sql return schema_editor._create_unique_sql( TypeError: _create_unique_sql() got an unexpected keyword argument 'deferrable' ``` This also adjusts the implementation to call `self_deferrable_constraint_sql(...)` with the deferrable arg; in this backend's case the return value is an empty string (like it is currently hardcoded). Essentially it's the same result but allows flexibility if this backend ever supported deferrable constraints. Backwards compatibility is maintained by checking for the passing of a deferrable keyword argument to the create sql function (not provided on earlier Django versions before 3.1) and that the database backend supports deferral for unique indexes.
1 parent d166fc9 commit 4883a50

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

sql_server/pyodbc/schema.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,13 @@ def add_field(self, model, field):
677677
if self.connection.features.connection_persists_old_columns:
678678
self.connection.close()
679679

680-
def _create_unique_sql(self, model, columns, name=None, condition=None):
680+
def _create_unique_sql(self, model, columns, name=None, condition=None, deferrable=None):
681+
if (
682+
deferrable and
683+
not self.connection.features.supports_deferrable_unique_constraints
684+
):
685+
return None
686+
681687
def create_unique_name(*args, **kwargs):
682688
return self.quote_name(self._create_index_name(*args, **kwargs))
683689

@@ -694,15 +700,16 @@ def create_unique_name(*args, **kwargs):
694700
name=name,
695701
columns=columns,
696702
condition=' WHERE ' + condition,
697-
deferrable=''
703+
deferrable=self._deferrable_constraint_sql(deferrable)
704+
698705
) if self.connection.features.supports_partial_indexes else None
699706
else:
700707
return Statement(
701708
self.sql_create_unique,
702709
table=table,
703710
name=name,
704711
columns=columns,
705-
deferrable=''
712+
deferrable=self._deferrable_constraint_sql(deferrable),
706713
)
707714

708715
def _create_index_sql(self, model, fields, *, name=None, suffix='', using='',

0 commit comments

Comments
 (0)