[3.1.x] Fixed #32224 -- Avoided suppressing connection errors in supports_json_field on SQLite.

Regression in 6789ded0a6.

Thanks Juan Garcia Alvite for the report.
Backport of f5e5aac59e from master
This commit is contained in:
Mariusz Felisiak 2020-11-25 12:19:45 +01:00
parent a582ef8b89
commit 97bfe0cba5
3 changed files with 28 additions and 5 deletions

View File

@ -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'))

View File

@ -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`).

View File

@ -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