Django default connections.cursor() не разбирает JSONB в DICT, несмотря на использование PSYCOPG3
Я перевожу старую кодовую базу с Django ~2 на Django 4.2.1. Вместе с этим переходом я обновил psycopg2 до psycopg (также известного как psycopg3), но этот переход привел к тому, что мой курсор стал некорректно получать строки из базы данных PostgreSQL.
Я получаю STR
вместо DICT
при выборе JSONB
объектов в моей базе данных
Важно: Когда я использую psycopg.connect напрямую, все поведение возвращается к тому, что я ожидал. Это происходит только тогда, когда я использую стандартное соединение django. from django.db import connection
Здесь я получаю некоторые json-объекты и проверяю их тип.
with connection.cursor() as cursor:
cursor.execute("select json_file from json_file") # These are of type jsonb
for row in cursor.fetchall():
type(row[1])
Обычно возвращается dict
, но сейчас возвращается str
Вот моя переменная DATABASES в настройках:
'default': {'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432,
'CONN_MAX_AGE': None,
'CONN_HEALTH_CHECKS': False,
'ENGINE': 'django.db.backends.postgresql',
}
Здесь Django's Connection + Cursor
> connections['default'].connection
<psycopg.Connection [IDLE] (host=db database=postgres) at 0x...>
> connections['default'].connection.cursor()
<django.db.backends.postgresql.base.Cursor [no result] [IDLE] (host=db database=postgres) at 0x...>
Вот связь psycopg's + Xursor
> psycopg.connect("...")
<psycopg.Connection [IDLE] (host=db database=postgres) at 0x...>
> psycopg.connect("...").cursor()
<psycopg.Cursor [no result] [IDLE] (host=db database=postgres) at 0x...>
In [54]: django_connection.cursor_factory
Out[54]: django.db.backends.postgresql.base.Cursor
In [55]: psycopg_connection.cursor_factory
Out[55]: psycopg.Cursor