소스 검색

Fixed #33125 -- Avoided redundant unique constraint when converting a non-unique field to primary key on MySQL and PostgreSQL.

Jordan Bae 3 년 전
부모
커밋
f5a3243911
3개의 변경된 파일11개의 추가작업 그리고 8개의 파일을 삭제
  1. 4 2
      django/db/backends/base/schema.py
  2. 0 6
      django/db/backends/oracle/schema.py
  3. 7 0
      tests/schema/tests.py

+ 4 - 2
django/db/backends/base/schema.py

@@ -1155,8 +1155,10 @@ class BaseDatabaseSchemaEditor:
         return not old_field.primary_key and new_field.primary_key
 
     def _unique_should_be_added(self, old_field, new_field):
-        return (not old_field.unique and new_field.unique) or (
-            old_field.primary_key and not new_field.primary_key and new_field.unique
+        return (
+            not new_field.primary_key and
+            new_field.unique and
+            (not old_field.unique or old_field.primary_key)
         )
 
     def _rename_field_sql(self, table, old_field, new_field, new_type):

+ 0 - 6
django/db/backends/oracle/schema.py

@@ -174,12 +174,6 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
             return False
         return create_index
 
-    def _unique_should_be_added(self, old_field, new_field):
-        return (
-            super()._unique_should_be_added(old_field, new_field) and
-            not self._field_became_primary_key(old_field, new_field)
-        )
-
     def _is_identity_column(self, table_name, column_name):
         with self.connection.cursor() as cursor:
             cursor.execute("""

+ 7 - 0
tests/schema/tests.py

@@ -741,6 +741,13 @@ class SchemaTests(TransactionTestCase):
         with connection.schema_editor() as editor:
             editor.remove_field(Author, Author._meta.get_field('id'))
             editor.alter_field(Author, old_field, new_field, strict=True)
+        # Redundant unique constraint is not added.
+        count = self.get_constraints_count(
+            Author._meta.db_table,
+            Author._meta.get_field('uuid').column,
+            None,
+        )
+        self.assertLessEqual(count['uniques'], 1)
 
     @isolate_apps('schema')
     def test_alter_primary_key_quoted_db_table(self):