SQLAlchemy查询常用方法

q = session.query(SomeMappedClass)

使用SQLAlchemy的session进行数据库查询时,会产生Query类的实例:

class sqlalchemy.orm.query.Query

以下是Query类一些常用的方法。

筛选

filter_by()

传入a=b格式的参数。

filter()

传入Class.a!=b表达式格式的参数。

limit(n)

限制返回n个结果。

offset(m)

从第m+1个结果开始返回。

slice(start, stop)

切片返回结果,类似limit和offset的组合。相当于offset(start).limit(stop-start)

结果

all()

将所有结果组成一个list返回。

first()

  • 没有查询结果时,返回None
  • 其他情况下,返回第一个查询结果;

one()

仅在查询结果为一个时返回结果,否则抛出错误。

  • 没有查询结果时,抛出sqlalchemy.orm.exc.NoResultFound
  • 一个查询结果时,返回该对象;
  • 当查询结果为多个时,抛出sqlalchemy.orm.exc.MultipleResultsFound

one_or_none()

  • 没有结果,返回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)

锁操作。mode取值如下:

  • None - 取消锁;
  • update - 被转义为SQL语句FOR UPDATE(标准SQL,大部分数据库支持);
  • update_nowait - 被转义为SQL语句FOR UPDATE NOWAIT(仅支持Oracle、PostgreSQL 8.1+版本);
  • read - 被转义为 LOCK IN SHARE MODE (MySQL数据库), FOR SHARE (PostgreSQL数据库)。

函数

func.sum

对查询到的记录的字段进行求和,如果记录不存在,结果为None,不是0。

参考链接

目录