Python sqlalchemy 高级用法

一. 关联查询

sys_user_list = SysPermission.query.join(OrgRolePermission, OrgRolePermission.sys_permission_id == SysPermission.id).filter(OrgRolePermission.role_name == user_cache["role"]).all()

二. 过滤查询

from sqlalchemy import not_
sys_list = SysPermission.query.filter(not_(SysPermission.type == 1))

三. and, or, in查询

from sqlalchemy import and_, or_
sys_user_list = SysPermission.query.filter(and_(SysPermission.type == 2, SysPermission.type == 3)).all()
sys_user_list = SysPermission.query.filter(or_(SysPermission.type == 2, SysPermission.type == 3)).all()
live_hls_video = LiveHlVideos.query.filter(LiveHlVideos.live_hl_id.in_(live_hls_list)).all()    # live_hls_list: [1,2,3]

四. func

from sqlalchemy import func
question_types = db.session.query(MoocBankQuestion.question_type, func.sum(MoocBankQuestion.points_possible), func.count(MoocBankQuestion.question_type)).filter(
            MoocBankQuestion.mooc_bank_id == mooc_bank_id).group_by(MoocBankQuestion.question_type).all()

 五.extract

# 查询时间
from app.models.canvas_new import MoocOrders 
from sqlalchemy import func, and_, extract

MoocOrders.query.filter(and_(extract('year', MoocOrders.created_at) == 2020, extract('month', MoocOrders.created_at) == 6)).all()                                                                  
MoocOrders.query.filter(func.to_char(MoocOrders.created_at, "yyyy-mm") == "2020-06").all()

start_at = start_at or []  # 示例 "2020-07-11"
end_at = end_at or []  # 示例 "2020-07-11"
f = table.query

if start_at and end_at:
    start_at = list(map(lambda x: int(x), start_at.split("-")))
    end_at = list(map(lambda x: int(x), end_at.split("-")))
    start = date(year=start_at[0], month=start_at[1], day=start_at[2])
    end = date(year=end_at[0], month=end_at[1], day=end_at[2])
    f = f.filter(table.created_at <= end).filter(table.created_at >= start)
else:
    if start_at:
        start_at = list(map(lambda x: int(x), start_at.split("-")))
        start = date(year=start_at[0], month=start_at[1], day=start_at[2])
        f = f.filter(table.created_at >= start)
    if end_at:
        end_at = list(map(lambda x: int(x), end_at.split("-")))
        end = date(year=end_at[0], month=end_at[1], day=end_at[2])
        f = f.filter(table.created_at <= end)
原文地址:https://www.cnblogs.com/rixian/p/11495757.html