#25243: inspectdb crashes if SQLite foreign key references sqlite_master
--------------------------------------------+--------------------
     Reporter:  ssokolow                    |      Owner:  nobody
         Type:  Bug                         |     Status:  new
    Component:  Core (Management commands)  |    Version:  1.8
     Severity:  Normal                      |   Keywords:
 Triage Stage:  Unreviewed                  |  Has patch:  0
Easy pickings:  0                           |      UI/UX:  0
--------------------------------------------+--------------------
 While trying to import an SQLite database from an old legacy codebase, I
 ran up against the following exception in Django 1.8.3:

 {{{
 #!sh
 ssokolow@monolith XXXXXXX [django] % python manage.py inspectdb >|
 models.py
 Traceback (most recent call last):
   File "manage.py", line 10, in <module>
     execute_from_command_line(sys.argv)
   File "/home/ssokolow/.virtualenvs/XXXXXXX/local/lib/python2.7/site-
 packages/django/core/management/__init__.py", line 338, in
 execute_from_command_line
     utility.execute()
   File "/home/ssokolow/.virtualenvs/XXXXXXX/local/lib/python2.7/site-
 packages/django/core/management/__init__.py", line 330, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/home/ssokolow/.virtualenvs/XXXXXXX/local/lib/python2.7/site-
 packages/django/core/management/base.py", line 393, in run_from_argv
     self.execute(*args, **cmd_options)
   File "/home/ssokolow/.virtualenvs/XXXXXXX/local/lib/python2.7/site-
 packages/django/core/management/base.py", line 444, in execute
     output = self.handle(*args, **options)
   File "/home/ssokolow/.virtualenvs/XXXXXXX/local/lib/python2.7/site-
 packages/django/core/management/commands/inspectdb.py", line 25, in handle
     for line in self.handle_inspection(options):
   File "/home/ssokolow/.virtualenvs/XXXXXXX/local/lib/python2.7/site-
 packages/django/core/management/commands/inspectdb.py", line 64, in
 handle_inspection
     relations = connection.introspection.get_relations(cursor, table_name)
   File "/home/ssokolow/.virtualenvs/XXXXXXX/local/lib/python2.7/site-
 packages/django/db/backends/sqlite3/introspection.py", line 128, in
 get_relations
     result = cursor.fetchall()[0]
 IndexError: list index out of range
 }}}

 Examining the output revealed that it was dying in a table named "todos"
 and, examing that further, I discovered that inspectdb did '''not''' like
 what the code was doing to partially enforce a home-built generic foreign
 key constraint.

 Here's the schema which caused it to fail:
 {{{
 #!sql
 CREATE TABLE todos (
     id INTEGER PRIMARY KEY,
     row_id INTEGER,
     table_name VARCHAR(64) DEFAULT 'stories' REFERENCES sqlite_master
 (tbl_name) ON DELETE RESTRICT ON UPDATE CASCADE COLLATE NOCASE,
     content TEXT NOT NULL CHECK(TRIM(content) <> '' AND TRIM(content) =
 content AND content NOT LIKE '%  %' AND content NOT GLOB '*[

 ]*')
 );
 }}}

 I had to manually dump the database to SQL, edit out this clause in vim
 (because SQLite's ALTER TABLE is so limited), and then re-create the
 database before inspectdb would successfully complete:
 {{{
 #!sql
 REFERENCES sqlite_master (tbl_name) ON DELETE RESTRICT ON UPDATE CASCADE
 }}}

 At the very least, it should probably have a clearer error message.

--
Ticket URL: <https://code.djangoproject.com/ticket/25243>
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/051.933a78552124541ef2eef80a2e0edb00%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to