diff options
| author | Simon Charette <charette.s@gmail.com> | 2016-05-24 15:29:11 -0400 |
|---|---|---|
| committer | Simon Charette <charette.s@gmail.com> | 2017-06-21 00:26:30 -0400 |
| commit | b50815ee418b38e719476c2d5f6e2bc69f686927 (patch) | |
| tree | 0778cf9501e342e2a8a8a7cf3967839617e773d7 /django | |
| parent | 3b429c96736b8328c40e5d77282b0d30de563c3c (diff) | |
Refs #25530 -- Renamed deferred SQL references on rename operation.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/backends/base/schema.py | 8 | ||||
| -rw-r--r-- | django/db/backends/ddl_references.py | 40 |
2 files changed, 48 insertions, 0 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index bf22711131..e31251ae81 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -376,6 +376,10 @@ class BaseDatabaseSchemaEditor: "old_table": self.quote_name(old_db_table), "new_table": self.quote_name(new_db_table), }) + # Rename all references to the old table name. + for sql in self.deferred_sql: + if isinstance(sql, Statement): + sql.rename_table_references(old_db_table, new_db_table) def alter_db_tablespace(self, model, old_db_tablespace, new_db_tablespace): """Move a model's table between tablespaces.""" @@ -570,6 +574,10 @@ class BaseDatabaseSchemaEditor: # Have they renamed the column? if old_field.column != new_field.column: self.execute(self._rename_field_sql(model._meta.db_table, old_field, new_field, new_type)) + # Rename all references to the renamed column. + for sql in self.deferred_sql: + if isinstance(sql, Statement): + sql.rename_column_references(model._meta.db_table, old_field.column, new_field.column) # Next, start accumulating actions to do actions = [] null_actions = [] diff --git a/django/db/backends/ddl_references.py b/django/db/backends/ddl_references.py index dd4d1aa415..61b7b9eaf8 100644 --- a/django/db/backends/ddl_references.py +++ b/django/db/backends/ddl_references.py @@ -19,6 +19,18 @@ class Reference: """ return False + def rename_table_references(self, old_table, new_table): + """ + Rename all references to the old_name to the new_table. + """ + pass + + def rename_column_references(self, table, old_column, new_column): + """ + Rename all references to the old_column to the new_column. + """ + pass + def __repr__(self): return '<%s %r>' % (self.__class__.__name__, str(self)) @@ -36,6 +48,10 @@ class Table(Reference): def references_table(self, table): return self.table == table + def rename_table_references(self, old_table, new_table): + if self.table == old_table: + self.table = new_table + def __str__(self): return self.quote_name(self.table) @@ -50,6 +66,12 @@ class TableColumns(Table): def references_column(self, table, column): return self.table == table and column in self.columns + def rename_column_references(self, table, old_column, new_column): + if self.table == table: + for index, column in enumerate(self.columns): + if column == old_column: + self.columns[index] = new_column + class Columns(TableColumns): """Hold a reference to one or many columns.""" @@ -92,6 +114,14 @@ class ForeignKeyName(TableColumns): self.to_reference.references_column(table, column) ) + def rename_table_references(self, old_table, new_table): + super().rename_table_references(old_table, new_table) + self.to_reference.rename_table_references(old_table, new_table) + + def rename_column_references(self, table, old_column, new_column): + super().rename_column_references(table, old_column, new_column) + self.to_reference.rename_column_references(table, old_column, new_column) + def __str__(self): suffix = self.suffix_template % { 'to_table': self.to_reference.table, @@ -124,5 +154,15 @@ class Statement(Reference): for part in self.parts.values() ) + def rename_table_references(self, old_table, new_table): + for part in self.parts.values(): + if hasattr(part, 'rename_table_references'): + part.rename_table_references(old_table, new_table) + + def rename_column_references(self, table, old_column, new_column): + for part in self.parts.values(): + if hasattr(part, 'rename_column_references'): + part.rename_column_references(table, old_column, new_column) + def __str__(self): return self.template % self.parts |
