千锋学习日记--flask_SQLALchemy之多表查询

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多表查询的理解,有错误的地方见谅,毕竟是第一次发博客,嘿嘿…有大佬带我也可以的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值