#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.