Browse Source

Fixed #24390 -- Made migration index names deterministic.

László Károlyi 10 năm trước cách đây
mục cha
commit
f37c11eea3
2 tập tin đã thay đổi với 14 bổ sung1 xóa
  1. 1 1
      django/db/backends/base/schema.py
  2. 13 0
      tests/indexes/tests.py

+ 1 - 1
django/db/backends/base/schema.py

@@ -798,7 +798,7 @@ class BaseDatabaseSchemaEditor(object):
             )
         # Else generate the name for the index using a different algorithm
         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
         # If the index name is too long, truncate it
         index_name = ('%s_%s%s%s' % (

+ 13 - 0
tests/indexes/tests.py

@@ -10,6 +10,19 @@ class SchemaIndexesTests(TestCase):
     """
     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):
         editor = connection.schema_editor()
         index_sql = editor._model_indexes_sql(Article)