SQLAlchemy 在 postgres 中添加/更新 jsonb 字段

colebod209

我正在尝试使用 SQLAlchemy 更新 postgres 数据库中 jsonb 字段内的值。

一直在尝试使用func.jsonb_set,但我不太清楚如何实现它。

使用如下表 ( test),我希望找到一种添加/编辑 json 数据的通用方法。

ID 数据 姓名
1 {“年龄”:44,“名字”:“巴里”,孩子”:[“baz”,“吉姆”]} 巴里
2 {“年龄”:47,“姓名”:“戴夫”,“孩子”:[“杰夫”,“简”]} 戴夫

以下适用于 postgres 的简单更新。

UPDATE "test" SET "data"=jsonb_set("data"::jsonb, '{age}', '45')
WHERE "data"::json->>'name'='dave';

我可以用来update更新这样的单个值:

testobj_res.update(
    {
        TestObj.data: cast(
            cast(TestObj.data, JSONB).concat(func.jsonb_build_object("age", 45)),
            JSON,
        )
    }
)

session.commit()

我希望能够传递例如多个字段的更新{"name": "barry", "age": 45, "height": 150}

我尝试使用func.jsonb_set添加更复杂的 json 结构而不是('age', 45)

testobj_res.first().data = func.jsonb_set(
    TestObj.data.cast(JSONB),
    ("age", 45),
    cast(TestObj.data, JSONB))

session.commit()

但我得到:

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedFunction) function jsonb_set(jsonb, record, jsonb) does not exist
LINE 1: UPDATE public.test SET data=jsonb_set(CAST(public.test.data ...
                                    ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

完整示例代码:

import os
from sqlalchemy.dialects.postgresql import JSON, JSONB
from sqlalchemy import func, cast
import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import urllib
from dotenv import load_dotenv

load_dotenv()

user = urllib.parse.quote_plus(os.environ.get("DB_USER"))
passwd = urllib.parse.quote_plus(os.environ.get("DB_PW"))

DB_URL = "postgresql://{}:{}@{}:{}/{}".format(
    user,
    passwd,
    os.environ.get("DB_HOST"),
    os.environ.get("DB_PORT"),
    os.environ.get("DB_NAME"),
)

engine = sa.create_engine(DB_URL)
Session = sessionmaker(bind=engine, autoflush=True)

session = Session()

Base = declarative_base()


class TestObj(Base):
    __tablename__ = "test"
    __table_args__ = {"autoload_with": engine, "schema": "public"}


testobj_res = session.query(TestObj).filter(TestObj.name == "dave")

testobj_res.first().data = func.jsonb_set(
    TestObj.data.cast(JSONB),
    ("age", 45),
    cast(TestObj.data, JSONB))

session.commit()

蛇符

这段代码

testobj_res.first().data = func.jsonb_set(
    TestObj.data.cast(JSONB),
    ("age", 45),
    cast(TestObj.data, JSONB))

正在传递一个 JSONB 对象、记录和另一个 JSONB 对象,jsonb_set但该函数需要一个 JSONB 对象、一个 JSONPath 字符串和路径的新值 JSONB *

('age', 45)包元组并删除最终的 JSONB 将产生所需的结果。

with Session.begin() as s:
    testobj = s.scalar(sa.select(TestObj).limit(1))
    testobj.data = sa.func.jsonb_set(
        sa.cast(testobj.data, postgresql.JSONB),
        '{age}',
        sa.cast(42, postgresql.JSONB)
    )

*还有一个可选的布尔 create-if-not-exists 参数,我们可以忽略它。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Postgres 更新 jsonb 字段

来自分类Dev

在Postgres 13中更新部分jsonb字段

来自分类Dev

在Postgres中的Jsonb内修改字段

来自分类Dev

在Postgres JSONB字段中全局替换

来自分类Dev

Postgres:查询多个jsonb字段

来自分类Dev

Postgres 检查空的 JSONB 字段

来自分类Dev

在Postgres中修改JSONB中字段的数据类型

来自分类Dev

如何使用 GORM 在 Postgres 的 JSONB 字段中插入数据

来自分类Dev

在Postgres中的JSONB字段中选择不为空的值

来自分类Dev

Postgres计数数组jsonb字段中的项目数

来自分类Dev

如何在postgres中对jsonb内部字段求和?

来自分类Dev

在postgres中更新jsonb对象

来自分类Dev

加速对 JSONB 对象字段 Postgres 的查询/索引 JSONB 字段

来自分类Dev

在Postgres中更新记录时,如何合并现有的jsonb字段?

来自分类Dev

如何使用 Peewee 更新 Postgres v9.4+ 中的 jsonb 字段

来自分类Dev

Postgres - 如何对 JSONB 字段执行 LIKE 查询?

来自分类Dev

从 Postgres JSONB 字段中选择缺失值

来自分类Dev

jsonb内部字段上的Postgres GROUP BY

来自分类Dev

在 Postgres 中存储和更新 jsonb 值

来自分类Dev

更新列表 Postgres jsonb 中的值

来自分类Dev

在jsonb字段上添加索引

来自分类Dev

在 JSONB 中添加布尔字段

来自分类Dev

Postgres array_to_string()在JSONB字段中具有数组

来自分类Dev

递归展平postgres中的嵌套jsonb,而没有未知的深度和未知的关键字段

来自分类Dev

根据其他字段的值在JSONB列中插入新项目-Postgres

来自分类Dev

SQLALchemy:查询Postgres JSONB列的单个键或键的子集

来自分类Dev

Postgres 9.6-jsonb列中特定字段的平均值,并按同一jsonb列中的另一个字段分组

来自分类Dev

where 子句 postgres 中的 JSONB

来自分类Dev

在Postgres中查询jsonb数组

Related 相关文章

  1. 1

    Postgres 更新 jsonb 字段

  2. 2

    在Postgres 13中更新部分jsonb字段

  3. 3

    在Postgres中的Jsonb内修改字段

  4. 4

    在Postgres JSONB字段中全局替换

  5. 5

    Postgres:查询多个jsonb字段

  6. 6

    Postgres 检查空的 JSONB 字段

  7. 7

    在Postgres中修改JSONB中字段的数据类型

  8. 8

    如何使用 GORM 在 Postgres 的 JSONB 字段中插入数据

  9. 9

    在Postgres中的JSONB字段中选择不为空的值

  10. 10

    Postgres计数数组jsonb字段中的项目数

  11. 11

    如何在postgres中对jsonb内部字段求和?

  12. 12

    在postgres中更新jsonb对象

  13. 13

    加速对 JSONB 对象字段 Postgres 的查询/索引 JSONB 字段

  14. 14

    在Postgres中更新记录时,如何合并现有的jsonb字段?

  15. 15

    如何使用 Peewee 更新 Postgres v9.4+ 中的 jsonb 字段

  16. 16

    Postgres - 如何对 JSONB 字段执行 LIKE 查询?

  17. 17

    从 Postgres JSONB 字段中选择缺失值

  18. 18

    jsonb内部字段上的Postgres GROUP BY

  19. 19

    在 Postgres 中存储和更新 jsonb 值

  20. 20

    更新列表 Postgres jsonb 中的值

  21. 21

    在jsonb字段上添加索引

  22. 22

    在 JSONB 中添加布尔字段

  23. 23

    Postgres array_to_string()在JSONB字段中具有数组

  24. 24

    递归展平postgres中的嵌套jsonb,而没有未知的深度和未知的关键字段

  25. 25

    根据其他字段的值在JSONB列中插入新项目-Postgres

  26. 26

    SQLALchemy:查询Postgres JSONB列的单个键或键的子集

  27. 27

    Postgres 9.6-jsonb列中特定字段的平均值,并按同一jsonb列中的另一个字段分组

  28. 28

    where 子句 postgres 中的 JSONB

  29. 29

    在Postgres中查询jsonb数组

热门标签

归档