sqlalchemy 查询 合并查询 union 多条件查询对应常量 case

在一个查询语句中想要对某个字段进行计算(统计/求和),可以用子查询实现。

例如2张表,一张表Book里面是数据信息,另一个张表BookTrading里面记录每次书籍售出数据,现在要获取书籍信息以及统计每种书籍各卖了多少钱

1
2
3
4
trading_subquery = db.session.query(func.ifnull(func.sum(BookTrading.total_price),0)
.filter(BookTrading.book_id == Book.id, BookTrading.status>0)
.correlate(Book).as_scalar()
book_query = db.session.query(Book, trading_subquery).filter(Book.status>0).all()

User 一个用户的介绍人,及其介绍的数量

1
2
3
subquery = db.session.query(User.introducer_id, func.count('*').label('introduce_count')).group_by(User.introducer_id).subquery()

db.session.query(User.name, subquery.c.introduce_count).outerjoin(subquery, User.id==subquery.c.introducer_id).all()

合并查询 union

例如2张表,TMOrderJDOrder 2张表存储的字段部分相同,现在我需要取2个表的数据合并且根据创建时间进行排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tm_query = db.session.query(TMOrder.id.label("order_id"),
TMOrder.price.label("order_price"),
TMOrder.create_time.label("create_time")),
func.ifnull(None, 1).label("shop_type")
.filter(TMOrder.user_id=1)

jd_query = db.session.query(JDOrder.id.label("order_id"),
JDOrder.price.label("order_price"),
JDOrder.create_time.label("create_time")),
func.ifnull(None, 2).label("shop_type")
.filter(TMOrder.user_id=1)

total_order_query = union(course_query, training_query).alias('order')

order_query = db.session.query(total_order_query).order_by(total_order_query.c.create_time())

多条件查询对应常量 case

例如查询Book 是否有销量 BookTrading

1
2
3
4
trading_subquery = db.session.query(func.count())
.filter(BookTrading.book_id == Book.id, BookTrading.status>0)
.correlate(Book).as_scalar()
book_query = db.session.query(Book, case(whens=((trading_subquery, 1),), else_=0).label("is_selled")).filter(Book.status>0).all()