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

安德鲁·贝克

我正在将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从模型中删除所有对它的引用

任何关于为什么发生这种情况的想法将不胜感激。

btmills

要添加到@Andrew Backer的有用答案中,这显然是故意的。3.1.1发行说明中

修复了使用自定义命令#31956)进行QuerySet.order_by()排序和分组时PostgreSQL崩溃的问题因此,现在使用原始SQL提取a将返回字符串,而不是预加载的数据。在这种情况下,您将需要显式调用JSONFielddecoderJSONFieldjson.loads()

在错误修正版本中找到与API不兼容的更改,这是令人惊讶的。现在,我将添加json.loads()呼叫,因为如前所述,不能保证::json解决方法也不会中断!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将JSON字符串插入Postgres并返回字段

docker检查,将字段键作为字符串返回

将查询快照中的文档作为JSON字符串Firestore返回

查询数据并作为 JSON 字符串返回

如何将输入字段的值作为URL查询字符串传递,该URL查询字符串将在单击“提交”按钮后打开?

如何将空值返回到空字符串字段

sql查询将int作为字符串-问题?

反序列化服务器将字符串返回到JSON

SQL Server中如何将存储过程的输出返回到字符串变量中

将字符串作为 Observable 返回

将烧瓶PyMongo字符串返回到ObjectID

将字符串从Fortran返回到C ++

将AJAX字符串返回到数组

将“找不到资源”返回到字符串中

将简单的字符串返回到html表单

如何将字符串从函数返回到 main()?

如何将字符串返回到主函数?

jQuery返回json作为字符串

使用 sqlalchemy 提交原始 SQL 时将日期作为字符串

尝试将shell命令的实时/实时输出作为字符串数据从函数返回到主函数

返回原始或修改后的字符串

将原始文件作为字符串导入

使用字符串(表中的多值字段)作为SQL查询中的where子句

Postgres JSON插入的原始参数化字符串

如何在调用 API 后返回原始字符串(不是 json 格式也不是 xml 格式,只是原始字符串)

JSON文件中的原始字符串字段值

在原始Django SQL查询中正确转义字符串

部分字符串作为字段值返回 mysql

C#:将多个字符串从表单散列到类,再返回到SQL