Fixed #33670 -- Fixed altering primary key on SQLite.
This commit is contained in:
parent
562e3bc09a
commit
b34238addc
|
@ -217,7 +217,12 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
|||
alter_field and getattr(alter_field[1], "primary_key", False)
|
||||
):
|
||||
for name, field in list(body.items()):
|
||||
if field.primary_key:
|
||||
if field.primary_key and not (
|
||||
# Do not remove the old primary key when an altered field
|
||||
# that introduces a primary key is the same field.
|
||||
alter_field
|
||||
and name == alter_field[1].name
|
||||
):
|
||||
field.primary_key = False
|
||||
restore_pk_field = field
|
||||
if field.auto_created:
|
||||
|
|
|
@ -3584,6 +3584,21 @@ class SchemaTests(TransactionTestCase):
|
|||
)
|
||||
self.assertEqual(self.get_primary_key(Tag._meta.db_table), "slug")
|
||||
|
||||
def test_alter_primary_key_the_same_name(self):
|
||||
with connection.schema_editor() as editor:
|
||||
editor.create_model(Thing)
|
||||
|
||||
old_field = Thing._meta.get_field("when")
|
||||
new_field = CharField(max_length=2, primary_key=True)
|
||||
new_field.set_attributes_from_name("when")
|
||||
new_field.model = Thing
|
||||
with connection.schema_editor() as editor:
|
||||
editor.alter_field(Thing, old_field, new_field, strict=True)
|
||||
self.assertEqual(self.get_primary_key(Thing._meta.db_table), "when")
|
||||
with connection.schema_editor() as editor:
|
||||
editor.alter_field(Thing, new_field, old_field, strict=True)
|
||||
self.assertEqual(self.get_primary_key(Thing._meta.db_table), "when")
|
||||
|
||||
def test_context_manager_exit(self):
|
||||
"""
|
||||
Ensures transaction is correctly closed when an error occurs
|
||||
|
|
Loading…
Reference in New Issue