Flask-Sqlalchemy—聚合、高级查询

Flask-Sqlalchemy—聚合、高级查询

本文中语法均为本人结合flask-sqlalchemy,sqlalchemy文档总结,如果有更简洁的语法或者发现文中错误,欢迎评论指出

首先,导入示例中的库

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import or_, and_
from sqlalchemy.sql import func

db = SQLAlchemy()
Session = db.sessionmaker(bind=db.engine)
session = Session()

聚合

  • 取数(count)

    python hello.py shell
    >>> from hello import db,Role,User
    >>> User.query.filter_by(role_id=3,username='susan').count()
    1L
    >>> User.query.filter_by(role_id=3).count()
    2L
    >>> User.query.count()
    3L
    
  • 求和(sum)

    python hello.py shell
    >>> from hello import db,Role,User
    >>> from sqlalchemy.sql import func
    >>> User.query.with_entities(func.sum(User.id)).all()
    [(Decimal('6'),)]
    >>> User.query.with_entities(func.sum(User.role_id)).all()
    [(Decimal('7'),)]
    

    方法二

    session.query(func.sum(Staff.id)).scalar()
    >>> Decimal('3')
    

    对比看下scalar函数的用处

  • 平均数(avg)

    python
    >>> from hello import db,Role,User
    >>> from sqlalchemy.sql import func
    >>> User.query.with_entities(func.avg(User.role_id)).all()
    [(Decimal('2.3333'),)]
    >>> User.query.with_entities(func.avg(User.id)).all()
    [(Decimal('2.0000'),)]
    

高级查询

sqlalchemy写法

  • 模糊匹配

    session.query(Staff).filter(Staff.name.like('%a%'))
    
  • 不等于

    session.query(Staff).filter(Staff.id!=1).all()
    
  • 大于,小于

    session.query(Staff).filter(Staff.id>1,Staff.score>1).all()
    
  • session.query(Staff).filter(or_(Staff.id>1, Staff.score<4)).all()
    
  • 包含

    session.query(Staff).filter(Staff.name.contains("a")).all()
    
  • 区间

    session.query(Staff).filter(Staff.id.between(1,2)).all()
    
  • session.query(Staff).filter(and_(Staff.id>1, Staff.score>2)).all()
    
  • 字段筛选

    >>> session.query(Staff.id,Staff.name).all()
    [(1, 'aa'), (2, 'bb')]
    
  • 去重

    session.query(Staff.name).distinct().all()
    

flask-sqlalchemy写法

  • 模糊匹配

    Staff.query.filter(Staff.name.like("%a%")).all()
    
  • 不等于

    Staff.query.filter(Staff.id!=1).all()
    
  • 大于,小于

    Staff.query.filter(Staff.id>1,Staff.score>1).all()
    
  • Staff.query.filter(or_(Staff.id>1, Staff.score<4)).all()
    
  • 包含

    Staff.query.filter(Staff.name.contains("a")).all()
    
  • 区间

    Staff.query.filter(Staff.id.between(1,2)).all()
    
  • Staff.query.filter(and_(Staff.id>1, Staff.score>2)).all()
    
  • 字段筛选

    >>> Staff.query.with_entities(Staff.name, Staff.id).all()
    [(1, 'aa'), (2, 'bb')]
    
  • 去重

    >>> Staff.query.with_entities(Staff.name).distinct().all()
    [('aa',), ('bb',)]
    
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页