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

参考链接