#33153: "database table is locked" error on SQLite when testing with mirror
database
-----------------------------------+--------------------------------------
Reporter: Adam Johnson | Owner: nobody
Type: Bug | Status: new
Component: Testing framework | Version: 4.0
Severity: Release blocker | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-----------------------------------+--------------------------------------
Description changed by Adam Johnson:
Old description:
> Requirements:
> * project uses SQLite for database
> * has a "replica" db alias set up as test mirror of default
> * `TestCase` has `databases = ["default", "replica"]`
> * Model is either from or two in a FK relationship
> * `TestCase` tries to create an instance of that model
>
> Result: The SQLite foreign key check, `PRAGMA foreign_key_check`, fails
> with an `OperationalError` like:
>
> {{{
> Traceback (most recent call last):
> File "/.../site-packages/django/test/testcases.py", line 278, in
> _setup_and_call
> self._post_teardown()
> File "/.../site-packages/django/test/testcases.py", line 1023, in
> _post_teardown
> self._fixture_teardown()
> File "/.../site-packages/django/test/testcases.py", line 1266, in
> _fixture_teardown
> connections[db_name].check_constraints()
> File "/.../site-packages/django/db/backends/sqlite3/base.py", line 322,
> in check_constraints
> violations = cursor.execute('PRAGMA foreign_key_check').fetchall()
> File "/.../site-packages/django/db/backends/utils.py", line 66, in
> execute
> return self._execute_with_wrappers(sql, params, many=False,
> executor=self._execute)
> File "/.../site-packages/django/db/backends/utils.py", line 75, in
> _execute_with_wrappers
> return executor(sql, params, many, context)
> File "/.../site-packages/django/db/backends/utils.py", line 84, in
> _execute
> return self.cursor.execute(sql, params)
> File "/.../site-packages/django/db/utils.py", line 90, in __exit__
> raise dj_exc_value.with_traceback(traceback) from exc_value
> File "/.../site-packages/django/db/backends/utils.py", line 82, in
> _execute
> return self.cursor.execute(sql)
> File "/.../site-packages/django/db/backends/sqlite3/base.py", line 414,
> in execute
> return Database.Cursor.execute(self, query)
> django.db.utils.OperationalError: database table is locked: core_author
> }}}
>
> Reproduction project to follow.
New description:
Requirements:
* project uses SQLite for database
* has a "replica" db alias set up as test mirror of default
* `TestCase` has `databases = ["default", "replica"]`
* Model is either from or two in a FK relationship
* `TestCase` tries to create an instance of that model
Result: The SQLite foreign key check, `PRAGMA foreign_key_check`, fails
with an `OperationalError` like:
{{{
Traceback (most recent call last):
File "/.../site-packages/django/test/testcases.py", line 278, in
_setup_and_call
self._post_teardown()
File "/.../site-packages/django/test/testcases.py", line 1023, in
_post_teardown
self._fixture_teardown()
File "/.../site-packages/django/test/testcases.py", line 1266, in
_fixture_teardown
connections[db_name].check_constraints()
File "/.../site-packages/django/db/backends/sqlite3/base.py", line 322,
in check_constraints
violations = cursor.execute('PRAGMA foreign_key_check').fetchall()
File "/.../site-packages/django/db/backends/utils.py", line 66, in
execute
return self._execute_with_wrappers(sql, params, many=False,
executor=self._execute)
File "/.../site-packages/django/db/backends/utils.py", line 75, in
_execute_with_wrappers
return executor(sql, params, many, context)
File "/.../site-packages/django/db/backends/utils.py", line 84, in
_execute
return self.cursor.execute(sql, params)
File "/.../site-packages/django/db/utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/.../site-packages/django/db/backends/utils.py", line 82, in
_execute
return self.cursor.execute(sql)
File "/.../site-packages/django/db/backends/sqlite3/base.py", line 414,
in execute
return Database.Cursor.execute(self, query)
django.db.utils.OperationalError: database table is locked: core_author
}}}
Reproduction project: https://github.com/adamchainz/django-ticket-33153 .
Simply run `./manage.py test` to see the above exception.
Removing the FK from the model, the `"replica"` entry in
`AuthorTests.databases`, or the mirror declaration in
`settings.py:DATABASES` causes the test to pass.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/33153#comment:1>
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 view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/068.1a4009f802452976697c50143cf60c15%40djangoproject.com.