summaryrefslogtreecommitdiff
path: root/django/db/backends/base
diff options
context:
space:
mode:
authorDavid Wobrock <david.wobrock@gmail.com>2022-05-02 17:22:54 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-05-12 20:44:03 +0200
commiteacd4977f6a4bb038e82796ba79a2f61bae330c6 (patch)
tree8d9b1c7d18226a8922826257ed997cee6229af10 /django/db/backends/base
parent20e65a34aea0ace077033c84854dcf225e248f8c (diff)
Refs #27064 -- Added RenameIndex migration operation.
Diffstat (limited to 'django/db/backends/base')
-rw-r--r--django/db/backends/base/features.py3
-rw-r--r--django/db/backends/base/schema.py19
2 files changed, 22 insertions, 0 deletions
diff --git a/django/db/backends/base/features.py b/django/db/backends/base/features.py
index a96dbe1b08..68cad9fef2 100644
--- a/django/db/backends/base/features.py
+++ b/django/db/backends/base/features.py
@@ -176,6 +176,9 @@ class BaseDatabaseFeatures:
# Can it create foreign key constraints inline when adding columns?
can_create_inline_fk = True
+ # Can an index be renamed?
+ can_rename_index = False
+
# Does it automatically index foreign keys?
indexes_foreign_keys = True
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index 468ab42490..f2ca8c8df9 100644
--- a/django/db/backends/base/schema.py
+++ b/django/db/backends/base/schema.py
@@ -131,6 +131,7 @@ class BaseDatabaseSchemaEditor:
"CREATE UNIQUE INDEX %(name)s ON %(table)s "
"(%(columns)s)%(include)s%(condition)s"
)
+ sql_rename_index = "ALTER INDEX %(old_name)s RENAME TO %(new_name)s"
sql_delete_index = "DROP INDEX %(name)s"
sql_create_pk = (
@@ -492,6 +493,16 @@ class BaseDatabaseSchemaEditor:
return None
self.execute(index.remove_sql(model, self))
+ def rename_index(self, model, old_index, new_index):
+ if self.connection.features.can_rename_index:
+ self.execute(
+ self._rename_index_sql(model, old_index.name, new_index.name),
+ params=None,
+ )
+ else:
+ self.remove_index(model, old_index)
+ self.add_index(model, new_index)
+
def add_constraint(self, model, constraint):
"""Add a constraint to a model."""
sql = constraint.create_sql(model, self)
@@ -1361,6 +1372,14 @@ class BaseDatabaseSchemaEditor:
name=self.quote_name(name),
)
+ def _rename_index_sql(self, model, old_name, new_name):
+ return Statement(
+ self.sql_rename_index,
+ table=Table(model._meta.db_table, self.quote_name),
+ old_name=self.quote_name(old_name),
+ new_name=self.quote_name(new_name),
+ )
+
def _index_columns(self, table, columns, col_suffixes, opclasses):
return Columns(table, columns, self.quote_name, col_suffixes=col_suffixes)