繁体   English   中英

如何在 POSTGRESQL (SQLALCHEMY) 中检查 JSON 列是否包含 INT 值

[英]how to check if JSON column contains a INT value in POSTGRESQL (SQLALCHEMY)

我有这张桌子:

class Users(base):
    # table setting
    __tablename__ = 'users'
    id = Column('id', BIGINT, primary_key=True)
    firstname = Column('firstname', VARCHAR(64))
    blocked = Column('blocked', JSON, default=[])  # [blocked_id]

我在该表中添加了一些行:

await session.execute(
    insert(Users).values(firstname='user_1', blocked=[1, 2, 3])
)
await session.execute(
    insert(Users).values(firstname='user_2', blocked=[2, 3, 4])
)
await session.execute(
    insert(Users).values(firstname='user_3', blocked=[3, 4, 5])
)
await session.commit()

我需要blocked列中值为1的第一个用户

(在这种情况下是我添加到该表中的第一个用户)

这是我正在尝试的方法:

request = await session.execute(
                select(Users.firstname) \
                .where(Users.blocked.contains(1)) \
                .order_by(Users.id) \
                .limit(1) 
        )
result = request.fetchone()

你能帮忙吗?

来自文档

JSONB 类型包括 JSON 提供的所有操作,包括索引操作的相同行为。 它还添加了特定于 JSONB 的其他运算符,包括 Comparator.has_key()、Comparator.has_all()、Comparator.has_any()、Comparator.contains() 和 Comparator.contained_by()。

因此,为了使用contains()方法,您需要将列声明为 JSONB 类型,或者您也可以先将其转换为 JSONB 类型。

class Users(base):
    ...
    blocked = Column('blocked', JSONB, default=[])  # [blocked_id]

仅供参考,也来自文档

与 JSON 类型一样,JSONB 类型在与 ORM 一起使用时不会检测就地更改,除非使用 sqlalchemy.ext.mutable 扩展。

因此,如果您更改此字段值并提交。 不确定是否会发出 UPDATE 语句,您应该显式调用update()方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM