gpt4 book ai didi

python - 升级后,原始 sql 查询在 postgres 上将 json 字段作为字符串返回

转载 作者:行者123 更新时间:2023-12-04 02:30:06 28 4
gpt4 key购买 nike

我正在将 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"}'
[编辑] 使用原始连接给出了预期的结果:
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 release notes :

Fixed a QuerySet.order_by() crash on PostgreSQL when ordering and grouping by JSONField with a custom decoder (#31956). As a consequence, fetching a JSONField with raw SQL now returns a string instead of pre-loaded data. You will need to explicitly call json.loads() in such cases.


在错误修复版本中发现与 API 不兼容的更改作为旁白是令人惊讶的。现在我将添加 json.loads() 调用,因为如前所述,不能保证 ::json 解决方法也不会中断!

关于python - 升级后,原始 sql 查询在 postgres 上将 json 字段作为字符串返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64760817/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com