mirror of https://github.com/django/django.git
Fixed #28541 -- Fixed migrations crash when changing primary key on SQLite.
This commit is contained in:
parent
3d7235c67b
commit
593067a8ee
|
@ -229,6 +229,14 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
||||||
body_copy["__module__"] = model.__module__
|
body_copy["__module__"] = model.__module__
|
||||||
new_model = type("New%s" % model._meta.object_name, model.__bases__, body_copy)
|
new_model = type("New%s" % model._meta.object_name, model.__bases__, body_copy)
|
||||||
|
|
||||||
|
# Remove the automatically recreated default primary key, if it has
|
||||||
|
# been deleted.
|
||||||
|
if delete_field and delete_field.attname == new_model._meta.pk.attname:
|
||||||
|
auto_pk = new_model._meta.pk
|
||||||
|
delattr(new_model, auto_pk.attname)
|
||||||
|
new_model._meta.local_fields.remove(auto_pk)
|
||||||
|
new_model.pk = None
|
||||||
|
|
||||||
# Create a new table with the updated schema.
|
# Create a new table with the updated schema.
|
||||||
self.create_model(new_model)
|
self.create_model(new_model)
|
||||||
|
|
||||||
|
|
|
@ -2802,6 +2802,42 @@ class OperationTests(OperationTestBase):
|
||||||
(f"{app_label}_pony", "id"),
|
(f"{app_label}_pony", "id"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_alter_id_pk_to_uuid_pk(self):
|
||||||
|
app_label = "test_alidpktuuidpk"
|
||||||
|
project_state = self.set_up_test_model(app_label)
|
||||||
|
new_state = project_state.clone()
|
||||||
|
# Add UUID field.
|
||||||
|
operation = migrations.AddField("Pony", "uuid", models.UUIDField())
|
||||||
|
operation.state_forwards(app_label, new_state)
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
operation.database_forwards(app_label, editor, project_state, new_state)
|
||||||
|
# Remove ID.
|
||||||
|
project_state = new_state
|
||||||
|
new_state = new_state.clone()
|
||||||
|
operation = migrations.RemoveField("Pony", "id")
|
||||||
|
operation.state_forwards(app_label, new_state)
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
operation.database_forwards(app_label, editor, project_state, new_state)
|
||||||
|
self.assertColumnNotExists(f"{app_label}_pony", "id")
|
||||||
|
# Rename to ID.
|
||||||
|
project_state = new_state
|
||||||
|
new_state = new_state.clone()
|
||||||
|
operation = migrations.RenameField("Pony", "uuid", "id")
|
||||||
|
operation.state_forwards(app_label, new_state)
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
operation.database_forwards(app_label, editor, project_state, new_state)
|
||||||
|
self.assertColumnNotExists(f"{app_label}_pony", "uuid")
|
||||||
|
self.assertColumnExists(f"{app_label}_pony", "id")
|
||||||
|
# Change to a primary key.
|
||||||
|
project_state = new_state
|
||||||
|
new_state = new_state.clone()
|
||||||
|
operation = migrations.AlterField(
|
||||||
|
"Pony", "id", models.UUIDField(primary_key=True)
|
||||||
|
)
|
||||||
|
operation.state_forwards(app_label, new_state)
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
operation.database_forwards(app_label, editor, project_state, new_state)
|
||||||
|
|
||||||
@skipUnlessDBFeature("supports_foreign_keys")
|
@skipUnlessDBFeature("supports_foreign_keys")
|
||||||
def test_alter_field_reloads_state_on_fk_with_to_field_target_type_change(self):
|
def test_alter_field_reloads_state_on_fk_with_to_field_target_type_change(self):
|
||||||
app_label = "test_alflrsfkwtflttc"
|
app_label = "test_alflrsfkwtflttc"
|
||||||
|
|
Loading…
Reference in New Issue