升级后,原始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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

将字符串发送到书签后,将单词书签中的字符串返回到excel

来自分类Dev

sql将列值返回到逗号分隔的字符串中

来自分类Dev

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

来自分类Dev

将字符串作为 Observable 返回

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

jQuery返回json作为字符串

来自分类Dev

SQL作为IF语句返回的字符串

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

spring-mvc返回原始json字符串

来自分类Dev

将JSON字符串作为字段数据放在MySQL上

来自分类Dev

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

来自分类Dev

在 SQL 中查询 JSON 字符串

来自分类Dev

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

来自分类Dev

如何将JSON字符串作为查询参数传递给API Gateway

来自分类Dev

Python:如何将 SQL 查询作为字符串输入而不会出错?

来自分类Dev

以 MM:SS 格式添加两次并作为字符串返回到最大精度

来自分类Dev

Postgres 查询将字符串化的 json 对象转换为 jsonb 对象

来自分类Dev

在Swift中使用Swifty将JSON作为字符串返回

来自分类Dev

AJAX 将 JSON 作为字符串传递给控制器返回 Null

来自分类Dev

字符串以数字开头,查询后返回不同的结果

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

    将字符串发送到书签后,将单词书签中的字符串返回到excel

  4. 4

    sql将列值返回到逗号分隔的字符串中

  5. 5

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

  6. 6

    将字符串作为 Observable 返回

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

    jQuery返回json作为字符串

  11. 11

    SQL作为IF语句返回的字符串

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

    spring-mvc返回原始json字符串

  19. 19

    将JSON字符串作为字段数据放在MySQL上

  20. 20

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

  21. 21

    在 SQL 中查询 JSON 字符串

  22. 22

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

  23. 23

    如何将JSON字符串作为查询参数传递给API Gateway

  24. 24

    Python:如何将 SQL 查询作为字符串输入而不会出错?

  25. 25

    以 MM:SS 格式添加两次并作为字符串返回到最大精度

  26. 26

    Postgres 查询将字符串化的 json 对象转换为 jsonb 对象

  27. 27

    在Swift中使用Swifty将JSON作为字符串返回

  28. 28

    AJAX 将 JSON 作为字符串传递给控制器返回 Null

  29. 29

    字符串以数字开头,查询后返回不同的结果

热门标签

归档