SQLAlchemy
SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在DB API之上,使用关系对象映加粗样式射进行数据库操作,简单地说就是:将类和对象转换成SQL,然后使用数据API执行并获取执行结果。
今天要说的就是 flask_SQLALchemy之多表查询
1.join查询
先假设一个需求,知道一个用户的学习成绩,要查询这个学习成绩所属的用户,第一个办法就是连接多个filter()来查询。
for u, s in session.query(User, Course).filter(User.uid==Course.uid).filter(Course.score=='80').all():
print(u,s)
# 执行结果
张三
80
还可以使用join()方法:
u = session.query(USER).join(Course).filter(Course.score=='80').one()
print(u)
# 执行结果
张三
Query.join() 知道如何在 User 和 Course 之间进行连接,因为我们设定了外键。假如我们没有指定外键,比如这样:
class User(Base):
__tablename__ = 'user'
uid = Column(Integer, primary_key=True)
username = Column(String(50))
password = Column(String(12))
class Course(Base):
__tablename__ = 'Course'
sid = Column(Integer, primary_key=True)
score = Column(String, nullable=False)
user_id = Column(Integer)
我们可以这样来让join()生效:
query,join(Course, User.uid==Course.user_id)
query.join(User.course)
query.join(Address, User.Course)
query.join('course')
2.子查询
当我们需要查询每个用户的课程数量时,需要先对course表按用户 ID 分组,统计各组数量,这样我们得到一张新表;然后用 JOIN 连接新表和 users 两个表,在这里,我们应该使用OUTER JOIN,因为使用 INTER JOIN 所得出的新表只包含两表的交集。
from sqlalchemy import func
sco = session.query(Course.user_id, func.count('*').label('course_count')).group_by(Course.user_id).all()
for i in sco:
print(i)
可以理解成 group_by() 方法生成了一张新的表,该表有两列,第一列是 user_id ,第二列是该 user_id 所拥有的 score的数量,几个成绩则有几门课程,这个值由 func() 跟着的方法产生,我们可以使用 c() 方法来访问这个值
scos = session.query(User, sco.c.course_count).outerjoin(sco, User.uid==sco.c.user_id).order_by(User.uid).all()
如果不用 outerjoin() 而使用 join(),就等于使用 SQL 中的 INTER JOIN,所得出的表只为两者交集,不会包含 None 值的列。
3.使用别名(aliased)
SQLAlchemy 使用 aliased() 方法表示别名,当我们需要把同一张表连接多次的时候,常常需要用到别名。
from sqlalchemy import aliased
# 把 Course表分别设置别名
adalias1 = aliased(Course)
adalias2 = aliased(Course)
for username, score1, score2 in session.query(User.name, adalias1.email_course, adalias2.score).join(adalias1, User.course).join(adalias2, User.course).filter(adalias1.score=='80').filter(adalias2.score=='75'):
print(username, score1, score2)
# 执行结果
张三 80 75
4.exists关键字
EXISTS 关键字可以在某些场景替代 JOIN 的使用。
from sqlalchemy import exists
sco= exists().where(Course.user_id==User.uid)
for name, in session.query(User.username).filter(sco):
print(name)
# 执行结果
张三
使用 has() 方法也能起到 JOIN 的作用:
session.query(Course).filter(~Course.user.has(User.username=='张三')).all()
这里的 ~ 符号是 “不” 的意思
ps:本人第一次接触flask框架,以上就是初学小白对flask_SQLALchemy多表查询的理解,有错误的地方见谅,毕竟是第一次发博客,嘿嘿…有大佬带我也可以的。