我正在将Django应用从2.2.7升级到3.1.3。该应用程序使用Postgres 12和psycopg2 2.8.6。
我按照指示进行了操作,并将所有django.contrib.postgres.fields.JSONField
参考都更改为django.db.models.JSONField
,并进行了迁移。这不会更改我的架构(很好)。
但是,当我执行原始查询时,这些jsonb
列的数据有时会作为文本返回或转换为文本。当直接使用来查询模型时,我没有看到这个问题Model.objects.get(...)
。
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "big_old_project.settings")
django.setup()
with connection.cursor() as c:
c.execute("select name, data from tbl where name=%s", ("rex",))
print(c.description)
for row in c.fetchall():
for col in row:
print(f"{type(col)} => {col!r}")
(Column(name='name', type_code=1043), Column(name='data', type_code=3802))
<class 'str'> => 'rex'
<class 'str'> => '{"toy": "bone"}'
[edit]使用原始连接可获得预期结果:
conn = psycopg2.connect("dbname=db user=x password=z")
with conn.cursor() as c:
...
<class 'str'> => 'rex'
<class 'dict'> => {'toy': 'bone'}
尝试使用“注册”适配器的老方法是行不通的,无论如何也不需要。
import psycopg2.extras
psycopg2.extras.register_json(oid=3802, array_oid=3807, globally=True)
这个应用程序有很多历史,所以也许有些东西踩在了psycopg2的脚趾上?到目前为止,我找不到任何内容,并且已注释掉所有与切向相关的内容。
浏览发行说明无济于事。我确实使用其他postgres字段,所以无法contrib.postgres.fields
从模型中删除所有对它的引用。
任何关于为什么发生这种情况的想法将不胜感激。
要添加到@Andrew Backer的有用答案中,这显然是故意的。从3.1.1发行说明中:
修复了使用自定义命令(#31956)进行
QuerySet.order_by()
排序和分组时PostgreSQL崩溃的问题。因此,现在使用原始SQL提取a将返回字符串,而不是预加载的数据。在这种情况下,您将需要显式调用。JSONField
decoder
JSONField
json.loads()
在错误修正版本中找到与API不兼容的更改,这是令人惊讶的。现在,我将添加json.loads()
呼叫,因为如前所述,不能保证::json
解决方法也不会中断!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句