summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2020-11-25 12:19:45 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-11-25 12:21:29 +0100
commit97bfe0cba55720802abc7a7190ccb1ac575da50d (patch)
tree12d7b9fc59418e652dcb9ee38df88cf844ffb72d
parenta582ef8b89a7e1e6724b6fdab93748c90afcabe3 (diff)
[3.1.x] Fixed #32224 -- Avoided suppressing connection errors in supports_json_field on SQLite.
Regression in 6789ded0a6ab797f0dcdfa6ad5d1cfa46e23abcd. Thanks Juan Garcia Alvite for the report. Backport of f5e5aac59ebbcea46b98d37834915de0f43d7cc8 from master
-rw-r--r--django/db/backends/sqlite3/features.py11
-rw-r--r--docs/releases/3.1.4.txt4
-rw-r--r--tests/backends/sqlite/test_features.py18
3 files changed, 28 insertions, 5 deletions
diff --git a/django/db/backends/sqlite3/features.py b/django/db/backends/sqlite3/features.py
index 597055a8ee..536fc45bd1 100644
--- a/django/db/backends/sqlite3/features.py
+++ b/django/db/backends/sqlite3/features.py
@@ -54,11 +54,12 @@ class DatabaseFeatures(BaseDatabaseFeatures):
@cached_property
def supports_json_field(self):
- try:
- with self.connection.cursor() as cursor, transaction.atomic():
- cursor.execute('SELECT JSON(\'{"a": "b"}\')')
- except OperationalError:
- return False
+ with self.connection.cursor() as cursor:
+ try:
+ with transaction.atomic(self.connection.alias):
+ cursor.execute('SELECT JSON(\'{"a": "b"}\')')
+ except OperationalError:
+ return False
return True
can_introspect_json_field = property(operator.attrgetter('supports_json_field'))
diff --git a/docs/releases/3.1.4.txt b/docs/releases/3.1.4.txt
index 4d9e949791..080db4f290 100644
--- a/docs/releases/3.1.4.txt
+++ b/docs/releases/3.1.4.txt
@@ -24,3 +24,7 @@ Bugfixes
* Fixed a regression in Django 3.1 that caused the incorrect grouping by a
``Q`` object annotation (:ticket:`32200`).
+
+* Fixed a regression in Django 3.1 that caused suppressing connection errors
+ when :class:`~django.db.models.JSONField` is used on SQLite
+ (:ticket:`32224`).
diff --git a/tests/backends/sqlite/test_features.py b/tests/backends/sqlite/test_features.py
new file mode 100644
index 0000000000..9b74794408
--- /dev/null
+++ b/tests/backends/sqlite/test_features.py
@@ -0,0 +1,18 @@
+from unittest import mock, skipUnless
+
+from django.db import OperationalError, connection
+from django.test import TestCase
+
+
+@skipUnless(connection.vendor == 'sqlite', 'SQLite tests.')
+class FeaturesTests(TestCase):
+ def test_supports_json_field_operational_error(self):
+ if hasattr(connection.features, 'supports_json_field'):
+ del connection.features.supports_json_field
+ msg = 'unable to open database file'
+ with mock.patch(
+ 'django.db.backends.base.base.BaseDatabaseWrapper.cursor',
+ side_effect=OperationalError(msg),
+ ):
+ with self.assertRaisesMessage(OperationalError, msg):
+ connection.features.supports_json_field