diff --git a/django/db/backends/schema.py b/django/db/backends/schema.py index b7e285dfc5..0671efbb1f 100644 --- a/django/db/backends/schema.py +++ b/django/db/backends/schema.py @@ -231,17 +231,7 @@ class BaseDatabaseSchemaEditor(object): to_table = field.rel.to._meta.db_table to_column = field.rel.to._meta.get_field(field.rel.field_name).column if self.connection.features.supports_foreign_keys: - self.deferred_sql.append( - self.sql_create_fk % { - "name": self._create_index_name( - model, [field.column], suffix="_fk_%s_%s" % (to_table, to_column) - ), - "table": self.quote_name(model._meta.db_table), - "column": self.quote_name(field.column), - "to_table": self.quote_name(to_table), - "to_column": self.quote_name(to_column), - } - ) + self.deferred_sql.append(self._create_fk_sql(model, field, "_fk_%(to_table)s_%(to_column)s")) elif self.sql_create_inline_fk: definition += " " + self.sql_create_inline_fk % { "to_table": self.quote_name(to_table), @@ -310,20 +300,11 @@ class BaseDatabaseSchemaEditor(object): model._meta.db_table, ", ".join(columns), )) - self.execute( - self.sql_delete_unique % { - "table": self.quote_name(model._meta.db_table), - "name": constraint_names[0], - }, - ) + self.execute(self._delete_constraint_sql(self.sql_delete_unique, model, constraint_names[0])) # Created uniques for fields in news.difference(olds): columns = [model._meta.get_field_by_name(field)[0].column for field in fields] - self.execute(self.sql_create_unique % { - "table": self.quote_name(model._meta.db_table), - "name": self._create_index_name(model, columns, suffix="_uniq"), - "columns": ", ".join(self.quote_name(column) for column in columns), - }) + self.execute(self._create_unique_sql(model, columns)) def alter_index_together(self, model, old_index_together, new_index_together): """ @@ -343,12 +324,7 @@ class BaseDatabaseSchemaEditor(object): model._meta.db_table, ", ".join(columns), )) - self.execute( - self.sql_delete_index % { - "table": self.quote_name(model._meta.db_table), - "name": constraint_names[0], - }, - ) + self.execute(self._delete_constraint_sql(self.sql_delete_index, model, constraint_names[0])) # Created indexes for field_names in news.difference(olds): fields = [model._meta.get_field_by_name(field)[0] for field in field_names] @@ -415,17 +391,7 @@ class BaseDatabaseSchemaEditor(object): self.deferred_sql.append(self._create_index_sql(model, [field])) # Add any FK constraints later if field.rel and self.connection.features.supports_foreign_keys and field.db_constraint: - to_table = field.rel.to._meta.db_table - to_column = field.rel.to._meta.get_field(field.rel.field_name).column - self.deferred_sql.append( - self.sql_create_fk % { - "name": self._create_index_name(model, [field.column], suffix="_fk_%s_%s" % (to_table, to_column)), - "table": self.quote_name(model._meta.db_table), - "column": self.quote_name(field.column), - "to_table": self.quote_name(to_table), - "to_column": self.quote_name(to_column), - } - ) + 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() @@ -445,12 +411,7 @@ class BaseDatabaseSchemaEditor(object): if field.rel: fk_names = self._constraint_names(model, [field.column], foreign_key=True) for fk_name in fk_names: - self.execute( - self.sql_delete_fk % { - "table": self.quote_name(model._meta.db_table), - "name": fk_name, - } - ) + self.execute(self._delete_constraint_sql(self.sql_delete_fk, model, fk_name)) # Delete the column sql = self.sql_delete_column % { "table": self.quote_name(model._meta.db_table), @@ -516,12 +477,7 @@ class BaseDatabaseSchemaEditor(object): old_field.column, )) for constraint_name in constraint_names: - self.execute( - self.sql_delete_unique % { - "table": self.quote_name(model._meta.db_table), - "name": constraint_name, - }, - ) + self.execute(self._delete_constraint_sql(self.sql_delete_unique, model, constraint_name)) # Drop any FK constraints, we'll remake them later fks_dropped = set() if old_field.rel and old_field.db_constraint: @@ -534,24 +490,14 @@ class BaseDatabaseSchemaEditor(object): )) for fk_name in fk_names: fks_dropped.add((old_field.column,)) - self.execute( - self.sql_delete_fk % { - "table": self.quote_name(model._meta.db_table), - "name": fk_name, - } - ) + self.execute(self._delete_constraint_sql(self.sql_delete_fk, model, fk_name)) # Drop incoming FK constraints if we're a primary key and things are going # to change. if old_field.primary_key and new_field.primary_key and old_type != new_type: for rel in new_field.model._meta.get_all_related_objects(): rel_fk_names = self._constraint_names(rel.model, [rel.field.column], foreign_key=True) for fk_name in rel_fk_names: - self.execute( - self.sql_delete_fk % { - "table": self.quote_name(rel.model._meta.db_table), - "name": fk_name, - } - ) + self.execute(self._delete_constraint_sql(self.sql_delete_fk, rel.model, fk_name)) # Removed an index? if (old_field.db_index and not new_field.db_index and not old_field.unique and not @@ -565,12 +511,7 @@ class BaseDatabaseSchemaEditor(object): old_field.column, )) for index_name in index_names: - self.execute( - self.sql_delete_index % { - "table": self.quote_name(model._meta.db_table), - "name": index_name, - } - ) + self.execute(self._delete_constraint_sql(self.sql_delete_index, model, index_name)) # Change check constraints? if old_db_params['check'] != new_db_params['check'] and old_db_params['check']: constraint_names = self._constraint_names(model, [old_field.column], check=True) @@ -581,12 +522,7 @@ class BaseDatabaseSchemaEditor(object): old_field.column, )) for constraint_name in constraint_names: - self.execute( - self.sql_delete_check % { - "table": self.quote_name(model._meta.db_table), - "name": constraint_name, - } - ) + self.execute(self._delete_constraint_sql(self.sql_delete_check, model, constraint_name)) # Have they renamed the column? if old_field.column != new_field.column: self.execute(self.sql_rename_column % { @@ -671,13 +607,7 @@ class BaseDatabaseSchemaEditor(object): self.execute(sql, params) # Added a unique? if not old_field.unique and new_field.unique: - self.execute( - self.sql_create_unique % { - "table": self.quote_name(model._meta.db_table), - "name": self._create_index_name(model, [new_field.column], suffix="_uniq"), - "columns": self.quote_name(new_field.column), - } - ) + self.execute(self._create_unique_sql(model, [new_field.column])) # Added an index? if (not old_field.db_index and new_field.db_index and not new_field.unique and not @@ -700,12 +630,7 @@ class BaseDatabaseSchemaEditor(object): model._meta.db_table, )) for constraint_name in constraint_names: - self.execute( - self.sql_delete_pk % { - "table": self.quote_name(model._meta.db_table), - "name": constraint_name, - }, - ) + self.execute(self._delete_constraint_sql(self.sql_delete_pk, model, constraint_name)) # Make the new one self.execute( self.sql_create_pk % { @@ -733,31 +658,11 @@ class BaseDatabaseSchemaEditor(object): if new_field.rel and \ (fks_dropped or (old_field.rel and not old_field.db_constraint)) and \ new_field.db_constraint: - to_table = new_field.rel.to._meta.db_table - to_column = new_field.rel.get_related_field().column - self.execute( - self.sql_create_fk % { - "table": self.quote_name(model._meta.db_table), - "name": self._create_index_name( - model, [new_field.column], suffix="_fk_%s_%s" % (to_table, to_column) - ), - "column": self.quote_name(new_field.column), - "to_table": self.quote_name(to_table), - "to_column": self.quote_name(to_column), - } - ) + self.execute(self._create_fk_sql(model, new_field, "_fk_%(to_table)s_%(to_column)s")) # Rebuild FKs that pointed to us if we previously had to drop them if old_field.primary_key and new_field.primary_key and old_type != new_type: for rel in new_field.model._meta.get_all_related_objects(): - self.execute( - self.sql_create_fk % { - "table": self.quote_name(rel.model._meta.db_table), - "name": self._create_index_name(rel.model, [rel.field.column], suffix="_fk"), - "column": self.quote_name(rel.field.column), - "to_table": self.quote_name(model._meta.db_table), - "to_column": self.quote_name(new_field.column), - } - ) + self.execute(self._create_fk_sql(rel.model, rel.field, "_fk")) # Does it have check constraints we need to add? if old_db_params['check'] != new_db_params['check'] and new_db_params['check']: self.execute( @@ -861,6 +766,37 @@ class BaseDatabaseSchemaEditor(object): "extra": "", } + def _create_fk_sql(self, model, field, suffix): + from_table = model._meta.db_table + from_column = field.column + to_table = field.related_field.model._meta.db_table + to_column = field.related_field.column + suffix = suffix % { + "to_table": to_table, + "to_column": to_column, + } + + return self.sql_create_fk % { + "table": self.quote_name(from_table), + "name": self._create_index_name(model, [from_column], suffix=suffix), + "column": self.quote_name(from_column), + "to_table": self.quote_name(to_table), + "to_column": self.quote_name(to_column), + } + + def _create_unique_sql(self, model, columns): + return self.sql_create_unique % { + "table": self.quote_name(model._meta.db_table), + "name": self._create_index_name(model, columns, suffix="_uniq"), + "columns": ", ".join(self.quote_name(column) for column in columns), + } + + def _delete_constraint_sql(self, template, model, name): + return template % { + "table": self.quote_name(model._meta.db_table), + "name": name, + } + def _constraint_names(self, model, column_names=None, unique=None, primary_key=None, index=None, foreign_key=None, check=None):