Opened 8 years ago
Last modified 6 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 migrationalphatable is createdbravotable is created; it uses foreign key toalpha- another
alphamigration is run, adding dummy field alphatable is renamed toalpha__oldbravoforeign key is re-linked toalpha__old- new table
alphais created and data fromalpha__oldis copied with applied alterations alpha__oldis droppedbravostill 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 , 8 years ago
| Attachment: | bug_repro.sh added |
|---|
by , 8 years ago
| Attachment: | db_schema.sql added |
|---|
Database schema after running migrations - see references to temporary openvpn_serverold table
comment:1 by , 8 years ago
| Description: | modified (diff) |
|---|
follow-up: 3 comment:2 by , 8 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 , 8 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 , 8 years ago
| Description: | modified (diff) |
|---|
Bug reproduction steps as shell script