id summary reporter owner description type status component version severity resolution keywords cc stage has_patch needs_docs needs_tests needs_better_patch easy ui_ux 25243 inspectdb crashes if SQLite foreign key references sqlite_master Stephan Sokolow nobody "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 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." Bug new Core (Management commands) 1.8 Normal dina.paolo@… Accepted 0 0 0 0 0 0