使用 SQLAlchemy 的 session.query()
进行数据库查询时,会得到一个 Query
实例:
q = session.query(SomeMappedClass)
Query
封装了 ORM 查询的各类操作。下面整理了最常用的方法,方便查阅。
筛选
filter_by()
以关键字参数的形式传入条件,例如 filter_by(status='active')
,生成等值筛选。
filter()
以表达式形式传入条件,例如 filter(User.age >= 18)
,支持复杂逻辑与多条件组合。
limit(n)
限制返回的结果数量为 n
条。
offset(m)
跳过前 m
条结果,从第 m + 1
条开始返回。
slice(start, stop)
按切片语义返回结果,相当于 offset(start).limit(stop - start)
。
结果
all()
执行查询并以 list
形式返回全部结果。
first()
返回首条记录;若无结果则返回 None
。
one()
要求结果恰好为一条:无结果抛出 sqlalchemy.orm.exc.NoResultFound
,多于一条抛出 sqlalchemy.orm.exc.MultipleResultsFound
。
one_or_none()
允许 0 或 1 条结果:无结果返回 None
,多于一条抛出 sqlalchemy.orm.exc.MultipleResultsFound
。
scalar()
返回首条记录的第一个元素;无结果返回 None
,多于一条同样抛出 sqlalchemy.orm.exc.MultipleResultsFound
。
count()
返回符合条件的记录数量;若无数据则返回 0
。
操作
get(ident)
通过主键 ID 直接获取对象,未命中时返回 None
。
update(values, synchronize_session=‘evaluate’, update_args=None)
批量更新匹配到的记录。例如:
session.query(User).filter(User.age == 25).update({User.age: User.age - 10})
with_lockmode(mode)
为查询结果加锁。常见取值:
None
:取消锁;update
:生成FOR UPDATE
;update_nowait
:生成FOR UPDATE NOWAIT
(Oracle、PostgreSQL 8.1+ 支持);read
:在 MySQL 中生成LOCK IN SHARE MODE
,在 PostgreSQL 中生成FOR SHARE
。
函数
func.sum
对结果集字段求和;若无记录则返回 None
,而非 0
。