Fixed #29778 -- Fixed quoting of unique index names.

Regression in 3b429c9673.
This commit is contained in:
Oleg 2018-09-25 23:00:20 +03:00 committed by Tim Graham
parent 8624459586
commit d1d5c97bc2
3 changed files with 18 additions and 1 deletions

View File

@ -1013,11 +1013,13 @@ class BaseDatabaseSchemaEditor:
) )
def _create_unique_sql(self, model, columns): def _create_unique_sql(self, model, columns):
def create_unique_name(*args, **kwargs):
return self.quote_name(self._create_index_name(*args, **kwargs))
table = model._meta.db_table table = model._meta.db_table
return Statement( return Statement(
self.sql_create_unique, self.sql_create_unique,
table=Table(table, self.quote_name), table=Table(table, self.quote_name),
name=IndexName(table, columns, '_uniq', self._create_index_name), name=IndexName(table, columns, '_uniq', create_unique_name),
columns=Columns(table, columns, self.quote_name), columns=Columns(table, columns, self.quote_name),
) )

View File

@ -19,3 +19,6 @@ Bugfixes
(:ticket:`29755`). (:ticket:`29755`).
* Added compatibility for ``cx_Oracle`` 7 (:ticket:`29759`). * Added compatibility for ``cx_Oracle`` 7 (:ticket:`29759`).
* Fixed a regression in Django 2.0 where unique index names weren't quoted
(:ticket:`29778`).

View File

@ -1558,6 +1558,18 @@ class SchemaTests(TransactionTestCase):
TagUniqueRename.objects.create(title="bar", slug2="foo") TagUniqueRename.objects.create(title="bar", slug2="foo")
Tag.objects.all().delete() Tag.objects.all().delete()
def test_unique_name_quoting(self):
old_table_name = TagUniqueRename._meta.db_table
try:
with connection.schema_editor() as editor:
editor.create_model(TagUniqueRename)
editor.alter_db_table(TagUniqueRename, old_table_name, 'unique-table')
TagUniqueRename._meta.db_table = 'unique-table'
# This fails if the unique index name isn't quoted.
editor.alter_unique_together(TagUniqueRename, [], (('title', 'slug2'),))
finally:
TagUniqueRename._meta.db_table = old_table_name
@isolate_apps('schema') @isolate_apps('schema')
@unittest.skipIf(connection.vendor == 'sqlite', 'SQLite naively remakes the table on field alteration.') @unittest.skipIf(connection.vendor == 'sqlite', 'SQLite naively remakes the table on field alteration.')
@skipUnlessDBFeature('supports_foreign_keys') @skipUnlessDBFeature('supports_foreign_keys')