使用 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。