Query

查询内容

  1. 模型对象。指定查找这个模型中所有的对象。
  2. 模型中的属性。可以指定只查找某个模型的其中几个属性。

    user = session.query(User).first()
    username = session.query(User.username).first()

常用的filter操作符

  1. equals:

    user = session.query(User).filter(User.name == "sunxiaoning").first()
  2. not equals:

    query.filter(User.username != 'sunxiaoning').all()
  3. like:

    query.filter(User.username.like('%ning%'))
  4. in:

    query.filter(User.username.in_(['sun','xiao','ning']))
    
    query.filter(User.username.in_(
        session.query(User.username).filter(User.username.like('%sun%'))
    ))
  5. not in:

    query.filter(~User.username.in_(['sun','xiao','ning']))
  6. is null:

    query.filter(User.username==None)
    # OR
    query.filter(User.username.is_(None))
  7. is not null:

    query.filter(User.username != None)
    # OR
    query.filter(User.username.isnot(None))
  8. 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)
  9. or:

    from sqlalchemy import or_  
    query.filter(or_(User.username=='sun', User.age<18))
  10. 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。

排序:

  1. order_by:可以指定根据这个表中的某个字段进行排序,如果在前面加了一个-,代表的是降序排序。
  2. 在模型定义的时候指定默认排序:有些时候,不想每次在查询的时候都指定排序的方式,可以在定义模型的时候就指定排序的方式。有以下两种方式:

    • relationship的order_by参数:在指定relationship的时候,传递order_by参数来指定排序的字段。
    • 在模型定义中,添加以下代码:

      __mapper_args__ = {
       "order_by": _id
       }
  3. 正序排序与倒序排序:默认是使用正序排序。如果需要使用倒序排序,那么可以使用这个字段的desc()方法,或者是在排序的时候使用这个字段的字符串名字,然后在前面加一个负号。

计数

Query定义了一个很方便的计数函数count()

limit、offset和切片操作:

  1. limit:可以限制每次查询的时候只查询几条数据。
  2. offset:可以限制查找数据的时候过滤掉前面多少条。
  3. 切片:可以对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()
Last modification:May 13, 2020
If you think my article is useful to you, please feel free to appreciate