我有这个表:
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()
方法