Query
查询内容
- 模型对象。指定查找这个模型中所有的对象。
模型中的属性。可以指定只查找某个模型的其中几个属性。
user = session.query(User).first() username = session.query(User.username).first()
常用的filter操作符
equals:
user = session.query(User).filter(User.name == "sunxiaoning").first()
not equals:
query.filter(User.username != 'sunxiaoning').all()
like:
query.filter(User.username.like('%ning%'))
in:
query.filter(User.username.in_(['sun','xiao','ning'])) query.filter(User.username.in_( session.query(User.username).filter(User.username.like('%sun%')) ))
not in:
query.filter(~User.username.in_(['sun','xiao','ning']))
is null:
query.filter(User.username==None) # OR query.filter(User.username.is_(None))
is not null:
query.filter(User.username != None) # OR query.filter(User.username.isnot(None))
and:
from sqlalchemy import and_ query.filter(and_(User.username=='sun', User.age<18)) # 或者是传递多个参数 query.filter(User.username=='sun', User.age<18) # 或者是通过多次filter操作 query.filter(User.username=='sun').filter(User.age<18)
or:
from sqlalchemy import or_ query.filter(or_(User.username=='sun', User.age<18))
MATCH:
query.filter(User.username.match('sun'))
SQLAlchemy中filter()和filter_by()的区别:
1、filter引用列名时,使用“类名.属性名”的方式,比较使用两个等号“==”
2、filter_by引用列名时,使用“属性名”,比较使用一个等号“=”
3、在使用多条件匹配的时候,filter需要借助sqlalchemy里的and_ ; 而filter_by不需要,直接把多个匹配条件写在一起
4、在使用多条件匹配时,用到>=、>、<=、<的情况,貌似不能使用filter_by。可能是姿势不对
返回列表(List)和单项(Scalar)
- all()返回一个列表。
- first()返回至多一个结果,而且以单项形式,而不是只有一个元素的tuple形式返回这个结果。
- one()返回且仅返回一个查询结果。当结果的数量不足一个或者多于一个时会报错。一般使用first()。
- one_or_none():从名称可以看出,当结果数量为0时返回None, 多于1个时报错。
- scalar()和one()类似,但是返回单项而不是tuple。
排序:
order_by
:可以指定根据这个表中的某个字段进行排序,如果在前面加了一个-
,代表的是降序排序。在模型定义的时候指定默认排序:有些时候,不想每次在查询的时候都指定排序的方式,可以在定义模型的时候就指定排序的方式。有以下两种方式:
- relationship的order_by参数:在指定relationship的时候,传递order_by参数来指定排序的字段。
在模型定义中,添加以下代码:
__mapper_args__ = { "order_by": _id }
- 正序排序与倒序排序:默认是使用正序排序。如果需要使用倒序排序,那么可以使用这个字段的
desc()
方法,或者是在排序的时候使用这个字段的字符串名字,然后在前面加一个负号。
计数
Query定义了一个很方便的计数函数count()
limit、offset和切片操作:
- limit:可以限制每次查询的时候只查询几条数据。
- offset:可以限制查找数据的时候过滤掉前面多少条。
切片:可以对Query对象使用切片操作,来获取想要的数据。可以使用
slice(start,stop)
方法来做切片操作。也可以使用[start:stop]
的方式来进行切片操作。一般在实际开发中,中括号的形式是用得比较多的。希望大家一定要掌握。示例代码如下:users = session.query(User).order_by(User._id.desc())[0:10]
聚合函数
- func.count:统计行的数量。
- func.avg:求平均值。
- func.max:求最大值。
- func.min:求最小值。
func.sum:求和。
func
上,其实没有任何聚合函数。但是因为他底层做了一些魔术,只要mysql中有的聚合函数,都可以通过func调用。session.query(func.count(User.id)).all()
group_by 和 having:
根据某个字段进行分组。比如想要根据性别进行分组,来统计每个分组分别有多少人,那么可以使用以下代码来完成:
session.query(User.username,func.count(User.id)).group_by(User.username).all()
having是对查找结果进一步过滤。比如只想要看未成年人的数量,那么可以首先对年龄进行分组统计人数,然后再对分组进行having过滤。示例代码如下:
result = session.query(User.age,func.count(User.id)).group_by(User.age).having(User.age >= 18).all()