Fixed #24390 -- Made migration index names deterministic.

This commit is contained in:
László Károlyi 2015-02-25 19:48:35 +01:00 committed by Tim Graham
parent 4fdc7015c0
commit f37c11eea3
2 changed files with 14 additions and 1 deletions

View File

@ -798,7 +798,7 @@ class BaseDatabaseSchemaEditor(object):
) )
# Else generate the name for the index using a different algorithm # Else generate the name for the index using a different algorithm
table_name = model._meta.db_table.replace('"', '').replace('.', '_') table_name = model._meta.db_table.replace('"', '').replace('.', '_')
index_unique_name = '_%x' % abs(hash((table_name, ','.join(column_names)))) index_unique_name = '_%s' % self._digest(*column_names)
max_length = self.connection.ops.max_name_length() or 200 max_length = self.connection.ops.max_name_length() or 200
# If the index name is too long, truncate it # If the index name is too long, truncate it
index_name = ('%s_%s%s%s' % ( index_name = ('%s_%s%s%s' % (

View File

@ -10,6 +10,19 @@ class SchemaIndexesTests(TestCase):
""" """
Test index handling by the db.backends.schema infrastructure. Test index handling by the db.backends.schema infrastructure.
""" """
def test_index_name_hash(self):
"""
Index names should be deterministic.
"""
with connection.schema_editor() as editor:
index_name = editor._create_index_name(
model=Article,
column_names=("column1", "column2", "column3"),
suffix="123",
)
self.assertEqual(index_name, "indexes_article_column1_856fe518123")
def test_index_together(self): def test_index_together(self):
editor = connection.schema_editor() editor = connection.schema_editor()
index_sql = editor._model_indexes_sql(Article) index_sql = editor._model_indexes_sql(Article)