Opened 7 years ago
Last modified 5 years ago
#29182 closed Bug
SQLite database migration breaks ForeignKey constraint, leaving <table_name>__old in db schema — at Version 4
Reported by: | ezaquarii | Owned by: | nobody |
---|---|---|---|
Component: | Migrations | Version: | 2.0 |
Severity: | Release blocker | Keywords: | sqlite migration |
Cc: | Simon Charette, Florian Apolloner, Adam Goode, Muflone | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
SQLite table alteration uses rename and copy method. When running a database migration from Django command (via call_command('migrate')
), database is left with references to <table_name>old table that has been dropped after migration.
This happens only when running SQLite DB migrations from management command under transaction.
Running migrations via ./manage.py migrate
does not cause any issues.
This is the demonstration:
https://github.com/ezaquarii/django-sqlite-migration-bug
Steps to reproduce the bug
- run ./bootstrap.sh
- from import app.models import *
- Bravo.objects.create()
- SQL cannot be executed due to missing table
main.app_alpha__old
app/management/commands/bootstrap.py:9
: run the migrationalpha
table is createdbravo
table is created; it uses foreign key toalpha
- another
alpha
migration is run, adding dummy field alpha
table is renamed toalpha__old
bravo
foreign key is re-linked toalpha__old
- new table
alpha
is created and data fromalpha__old
is copied with applied alterations alpha__old
is droppedbravo
still referencesalpha__old
- ForeignKey constraint is not updated and DB is left in unusable state
CREATE TABLE "app_bravo" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "dummy" varchar(10) NOT NULL, "alpha_id" integer NOT NULL REFERENCES "app_alpha__old" ("id") DEFERRABLE INITIALLY DEFERRED);
Tested with Django versions: 2.0.1 and 2.0.2
Change History (6)
by , 7 years ago
Attachment: | bug_repro.sh added |
---|
by , 7 years ago
Attachment: | db_schema.sql added |
---|
Database schema after running migrations - see references to temporary openvpn_serverold table
comment:1 by , 7 years ago
Description: | modified (diff) |
---|
follow-up: 3 comment:2 by , 7 years ago
Could you provide a more minimal project that reproduces the issue? In particular, the steps to reproduce shouldn't require installing a bunch of NodeJS packages. Thanks!
comment:3 by , 7 years ago
Description: | modified (diff) |
---|
Please check this repository:
https://github.com/ezaquarii/django-sqlite-migration-bug
Please check out bootstrap.py
with transaction.atomic(): call_command('migrate')
I think this is the issue. It works ok without transaction.
comment:4 by , 7 years ago
Description: | modified (diff) |
---|
Bug reproduction steps as shell script