user_type_list = session.query(UserTpye).all()
# 如果type(user_type_list[0] ),会发现,这其实是个对象,与前面的每一个对象就是一行对应了起来
也能加条件 user_type_list = session.query(UserTpye).filter(User.id>2)
for row in user_type_list:
print(row.id,row.title)
还有分组,排序,连表,通配符,子查询,分页limit,union,where....
ret = session.query(Users).filter(Users.id > 1 ,Users.name == '小明').all() # 默认是and
ret = session.query(Users).filter(Users.id.between(1,3),Users.name=='小明').all()
ret = session.query(Users).filter(~Users.id.in_([1,2,3])).all # in_要加下划线,~代表not
ret = session.query(Users).filter_by(name='小明').all # 传的是参数,不是表达式
通配符 ret = session.query(Users).filter.(Users.name.like('e%'))
限制 ret = session.query(Users)[1:2]
排序 ret = session.query(Users).order_by(Users.name.desc()).all
ret = session.query(Users).order_by(Users.name.desc(),Users.id.asc()).all
分组 ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id)>2).all()
连表 ret = session.query(Users,UsersType) # 没有加条件的连表(笛卡尔积)
ret = session.query(Users,UsersType).filter(User.usertype_id == UserType.id) # 有条件的连表查询
ret = session.query(Users).join(UserType) # 相当于inner join
# 他会自己帮我们需找创建表时候的外键,所以后面的on usertype.id=users.user_type_id不用我们自己写
组合
q1=session.query(Users.name).filter(Users.id>2)
q2=session.query(Favor.caption).filter(Favor.id <2)
ret = q1.union(q2).all() # 取两组数据,上下连表,去重
ret = q1.union_all(q2).all() # 不去重
临时表 q1=session.query(UserType).filter(UserType.id >2).subquery() # 把q1当成子查询才能使用,不然就是SQL语句
ret = session.query(q1).all() # 相当于 select * from (select * fom UserType where UserType > 2) as A
ret = session.query(UserType.id,session.query(Users).subquery()).all() # 但是显示的是笛卡尔积
# 相当于select id,(select * from Users) from usertype
# 如果是 session.query(UserType,session.query(Users).filter(Users.id == 1).subquery) 也不行,因为相当于session.query(UserType,Users) 也是笛卡尔积
# 最后应该是这样的 session.query(UserType,session.query(Users).filter(Users.id == 1).as_scalar()) 把表变成数据