summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2016-05-24 15:29:11 -0400
committerSimon Charette <charette.s@gmail.com>2017-06-21 00:26:30 -0400
commitb50815ee418b38e719476c2d5f6e2bc69f686927 (patch)
tree0778cf9501e342e2a8a8a7cf3967839617e773d7 /django
parent3b429c96736b8328c40e5d77282b0d30de563c3c (diff)
Refs #25530 -- Renamed deferred SQL references on rename operation.
Diffstat (limited to 'django')
-rw-r--r--django/db/backends/base/schema.py8
-rw-r--r--django/db/backends/ddl_references.py40
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