[英]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.