#28849: SQLite foreign key constraints are not repointed on model or field 
rename
-------------------------------------------+------------------------
               Reporter:  Simon Charette   |          Owner:  nobody
                   Type:  Bug              |         Status:  new
              Component:  Migrations       |        Version:  2.0
               Severity:  Release blocker  |       Keywords:
           Triage Stage:  Accepted         |      Has patch:  0
    Needs documentation:  1                |    Needs tests:  0
Patch needs improvement:  0                |  Easy pickings:  0
                  UI/UX:  0                |
-------------------------------------------+------------------------
 SQLite foreign key constraints are not automatically repointed on table or
 column renames which is going to cause a issues to projects who previously
 renamed a model or a column referenced by another model when they migrate
 to Django 2.0 which start enforcing them.

 e.g. of a SQLite3 session

 {{{#!sql
 SQLite version 3.11.0 2016-02-15 17:29:24
 Enter ".help" for usage hints.
 Connected to a transient in-memory database.
 Use ".open FILENAME" to reopen on a persistent database.
 sqlite> CREATE TABLE foo ("id" integer NOT NULL PRIMARY KEY
 AUTOINCREMENT);
 sqlite> CREATE TABLE bar ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
 "foo_id" integer NOT NULL REFERENCES "foo" ("id") DEFERRABLE INITIALLY
 DEFERRED);
 sqlite> ALTER TABLE foo RENAME TO renamed;
 sqlite> .schema bar
 CREATE TABLE bar ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
 "foo_id" integer NOT NULL REFERENCES "foo" ("id") DEFERRABLE INITIALLY
 DEFERRED);  # It still points to "foo"
 sqlite> INSERT INTO bar (foo_id) VALUES (999);
 sqlite> PRAGMA foreign_keys = ON; # From Django 2.0+
 sqlite> INSERT INTO bar (foo_id) VALUES (999);
 Error: no such table: main.foo
 }}}

 Since we're already documenting that
 [https://docs.djangoproject.com/en/2.0/releases/2.0/#foreign-key-
 constraints-are-now-enabled-on-sqlite users should remake their tables] it
 should alleviate the issue but we should also sure to:

 1. Document that tables that have been previously renamed (or had a column
 referenced by a `ForeignKey(to_field)` renamed) ''must'' be rebuilt.
 2. Adjust SQLite's schema editor to remake tables referencing a renamed
 table or one that is remade to simulate a column rename to prevent this
 from happening from now on.

 This was discovered while working on fixing #25817.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/28849>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.57a82688fceaf5275ff2d81c322e1a57%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to