diff options
Diffstat (limited to 'django/db/backends/base/schema.py')
| -rw-r--r-- | django/db/backends/base/schema.py | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index 113d1b7f67..0522abcaad 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -77,6 +77,7 @@ class BaseDatabaseSchemaEditor: "REFERENCES %(to_table)s (%(to_column)s)%(deferrable)s" ) sql_create_inline_fk = None + sql_create_column_inline_fk = None sql_delete_fk = sql_delete_constraint sql_create_index = "CREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)s%(condition)s" @@ -433,6 +434,22 @@ class BaseDatabaseSchemaEditor: db_params = field.db_parameters(connection=self.connection) if db_params['check']: definition += " " + self.sql_check_constraint % db_params + if field.remote_field and self.connection.features.supports_foreign_keys and field.db_constraint: + constraint_suffix = '_fk_%(to_table)s_%(to_column)s' + # Add FK constraint inline, if supported. + if self.sql_create_column_inline_fk: + to_table = field.remote_field.model._meta.db_table + to_column = field.remote_field.model._meta.get_field(field.remote_field.field_name).column + definition += " " + self.sql_create_column_inline_fk % { + 'name': self._fk_constraint_name(model, field, constraint_suffix), + 'column': self.quote_name(field.column), + 'to_table': self.quote_name(to_table), + 'to_column': self.quote_name(to_column), + 'deferrable': self.connection.ops.deferrable_sql() + } + # Otherwise, add FK constraints later. + else: + self.deferred_sql.append(self._create_fk_sql(model, field, constraint_suffix)) # Build the SQL and run it sql = self.sql_create_column % { "table": self.quote_name(model._meta.db_table), @@ -451,9 +468,6 @@ class BaseDatabaseSchemaEditor: self.execute(sql, params) # Add an index, if required self.deferred_sql.extend(self._field_indexes_sql(model, field)) - # Add any FK constraints later - if field.remote_field and self.connection.features.supports_foreign_keys and field.db_constraint: - self.deferred_sql.append(self._create_fk_sql(model, field, "_fk_%(to_table)s_%(to_column)s")) # Reset connection if required if self.connection.features.connection_persists_old_columns: self.connection.close() @@ -984,18 +998,8 @@ class BaseDatabaseSchemaEditor: } def _create_fk_sql(self, model, field, suffix): - def create_fk_name(*args, **kwargs): - return self.quote_name(self._create_index_name(*args, **kwargs)) - table = Table(model._meta.db_table, self.quote_name) - name = ForeignKeyName( - model._meta.db_table, - [field.column], - split_identifier(field.target_field.model._meta.db_table)[1], - [field.target_field.column], - suffix, - create_fk_name, - ) + name = self._fk_constraint_name(model, field, suffix) column = Columns(model._meta.db_table, [field.column], self.quote_name) to_table = Table(field.target_field.model._meta.db_table, self.quote_name) to_column = Columns(field.target_field.model._meta.db_table, [field.target_field.column], self.quote_name) @@ -1010,6 +1014,19 @@ class BaseDatabaseSchemaEditor: deferrable=deferrable, ) + def _fk_constraint_name(self, model, field, suffix): + def create_fk_name(*args, **kwargs): + return self.quote_name(self._create_index_name(*args, **kwargs)) + + return ForeignKeyName( + model._meta.db_table, + [field.column], + split_identifier(field.target_field.model._meta.db_table)[1], + [field.target_field.column], + suffix, + create_fk_name, + ) + def _delete_fk_sql(self, model, name): return self._delete_constraint_sql(self.sql_delete_fk, model, name) |
