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)
|
alter_field and getattr(alter_field[1], "primary_key", False)
|
||||||
):
|
):
|
||||||
for name, field in list(body.items()):
|
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
|
field.primary_key = False
|
||||||
restore_pk_field = field
|
restore_pk_field = field
|
||||||
if field.auto_created:
|
if field.auto_created:
|
||||||
|
|
|
@ -3584,6 +3584,21 @@ class SchemaTests(TransactionTestCase):
|
||||||
)
|
)
|
||||||
self.assertEqual(self.get_primary_key(Tag._meta.db_table), "slug")
|
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):
|
def test_context_manager_exit(self):
|
||||||
"""
|
"""
|
||||||
Ensures transaction is correctly closed when an error occurs
|
Ensures transaction is correctly closed when an error occurs
|
||||||
|
|
Loading…
Reference in New Issue