1.关联子查询-primaryjoin
-
目标:可以直接使用primaryjoin指明关联条件
-
文件: d01_primaryjoin.py
-
除了可以使用ForeignKey的方式之外,还可以直接使用primaryjoin
-
使用方式:
# primaryjoin='用户表.id==foreign(关系表.user_id)' followings = db.relationship('Relation', primaryjoin='User.id==foreign(Relation.user_id)')
-
小结
1.使用primaryjoin,代码看起来更加直观,所以建议使用primaryjoin 2.在sqlalchemy设置的外键属性跟数据库表中的外键没有任何关系。
2.relathionship其他参数说明
-
上面获取关系列表的数据,是包含所有的,应该需要加上过滤条件relation=1
-
文件: d02_relathionship_param.py
-
获取关注列表:
select user_id, target_user_id from user_relation where user_id=1 and relation=1;
-
lazy=‘dynamic’ 惰性查询,返回一个query对象,可以进一步过滤
followings = db.relationship('Relation', foreign_keys='Relation.user_id', lazy='dynamic') user.followings.filter_by(relation=Relation.RELATION.FOLLOW).all()
-
uselist: 是否返回对象列表, True(默认) 返回对象列表 False返回第一个对象
-
获取用户的资料表数据,1对1的关系,所以此时适合使用uselist=False, 返回一个对象即可
user_profile = db.relationship('UserProfile', primaryjoin='User.id==foreign(UserProfile.id)', uselist=False) user = User.query.get(5) print(user.profile.gender)
3.join查询的使用
-
目标: 可以在sqlalchemy中使用关联查询inner join
-
文件: d03_inner_join.py
-
使用子查询,会生成多条sql语句进行查询,效率低下。
-
所以我们要使用inner join提高查询效率。
-
需求:
获取用户1的所有关注列表,指定返回的字段。 relation_id, user_id, target_user_id, target_user_name
-
sql
select r.relation_id, r.user_id, r.target_user_id, u.user_name as target_user_name from user_relation as r inner join user_basic as u on r.target_user_id = u.user_id where r.user_id=1 and r.relation=1;
-
sqlalchemy中子查询的做法
# Relation类加一个relation属性target_user: target_user = db.relationship( 'User', primaryjoin='User.id==foreign(Relation.target_user_id)', uselist=False) # 查询(发生子查询,打开SQLALCHEMY_ECHO = True看sql语句) from sqlalchemy.orm import load_only relations = Relation.query.filter( Relation.user_id == 1, Relation.relation == 1, ).options(load_only( Relation.id, Re