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



我有这个表:

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.hasa_any((、比较器.contations((和比较器.contated_by((。

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

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

仅供参考,也来自文档

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

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

最新更新