Opened 2 years ago
Closed 2 years ago
#34665 closed Bug (invalid)
CreateModel with manually added RenameField crashes on SQLite.
| Reported by: | Amchii | Owned by: | nobody | 
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 4.2 | 
| Severity: | Normal | Keywords: | sqlite3 | 
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no | 
| Needs tests: | no | Patch needs improvement: | no | 
| Easy pickings: | no | UI/UX: | no | 
Description
When using the SQLite database to perform migrations in Django 4.1 and 4.2, an OperationalError is thrown; however, it works normally on versions below 4.1 and also works normally on MySQL.
Here's the reproduction steps(use sqlite3):
- models.py:
from django.db import models class Person(models.Model): class Meta: db_table = "person" name = models.CharField(max_length=32) age = models.IntegerField() open_id = models.PositiveBigIntegerField(db_index=True) 
- run python manage.py makemigrations and it generates
 
0001_initial.py:
# Generated by Django 4.2.2 on 2023-06-19 06:10
from django.db import migrations, models
class Migration(migrations.Migration):
    initial = True
    dependencies = []
    operations = [
        migrations.CreateModel(
            name="Person",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("name", models.CharField(max_length=32)),
                ("age", models.IntegerField()),
                ("open_id", models.PositiveBigIntegerField(db_index=True)),
            ],
            options={
                "db_table": "person",
            },
        ),
    ]
- rename field 
open_id->open_uid, edit 0001_initial.py and add this line: 
migrations.RenameField(
            model_name="person",
            old_name="open_id",
            new_name="open_uid",
        ),
- remove field 'age' and run python manage.py makemigrations, it generates 0002_remove_person_age.py:
 
# Generated by Django 4.2.2 on 2023-06-19 06:12
from django.db import migrations
class Migration(migrations.Migration):
    dependencies = [
        ("myapp", "0001_initial"),
    ]
    operations = [
        migrations.RemoveField(
            model_name="person",
            name="age",
        ),
    ]
- run python manage.py migrate, it raises:
 
django.db.utils.OperationalError: error in index person_open_id_aac92076 after drop column: no such column: open_id
I encountered this issue while testing after upgrading an old project from Django version to 4.1. Although I manually added a line instead of using makemigrations when renaming the 'open_id' field, it should still work properly?
Change History (1)
comment:1 by , 2 years ago
| Resolution: | → invalid | 
|---|---|
| Status: | new → closed | 
| Summary: | An OperationalError is thrown when using SQLite database in Django 4.1 during 'migrate', while it works normally on versions below 4.1 and also works normally on MySQL. → CreateModel with manually added RenameField crashes on SQLite. | 
It worked on Django 4.0 because the
persontable was recreated by the second migrations (which is no longer necessary in SQLite 3.35.5+, see 3702819227fd0cdd9b581cd99e11d1561d51cbeb), however in all versions of Django index is created on a wrong column:ALTER TABLE "person" RENAME COLUMN "open_id" TO "open_uid"; CREATE INDEX "person_open_id_aac92076" ON "person" ("open_id");In general, you can edit migrations manually, but you do so at your own risk. In this case you should update the column name in the
CreateModeloperation instead of addingRenameField.