sqlalchemy使用进阶
1.子查询使用,subquery()
场景:对于ldap日志,笔者进行账号风险分析,每天将存在账号共用现象的账号存入mysql,在月末对于所有账号筛选最大风险的记录作为该用户的本月风险。
表名ldap_share_record_by_day,包含字段如下
id:主键自增
account:ldap账号
maxShare:共用终端
auditMonth:审计月份
auditDate:审计日期
createTime:创建时间
想要将2018-10的所有用户maxShare最大值对应的记录取出,如果用sql语句查询mysql应该是:
select record_by_day.id, record_by_day.account, record_by_day.auditMonth, record_by_day.maxShare
from record_by_day,
(select id as tId, max(maxShare) as tMaxShare
from record_by_day
where auditMonth="2018-10"
group by account
order by max(maxShare)
)t
where id=t.tId;
那么,借用子查询subquery如下:
def read_record_one_month(t=record_by_day, month="2018-10"):
session = db_session
sbq = session.query(t.id.label("tId"), func.max(t.maxShare).label("tMaxShare"))\
.filter_by(auditMonth=month).group_by(t.account)\
.order_by(func.max(t.maxShare).desc()).subquery()
query_set = session.query(t).filter(t.id == sbq.c.tId)
for q in query_set:
yield q.to_dict() # to_dict() 方法会以字典方式返回记录,在orm类中自定义的方法
注意 sbq.c.tId 的 c 。