我有三个表(SQLAlchemy类):团队、游戏和GameObserver。每场比赛都有两个比赛小组(攻防),但有很多观察队。
什么查询会返回所有的观察员(队)的游戏,其中的攻击队电子邮件是foo@email123.com?
class Team(db.Model):
id = db.Column(db.Integer(), primary_key=True)
email = db.Column(db.String(120), index=True, unique=True)
class Game(db.Model):
id = db.Column(db.Integer, primary_key=True)
offense_id = db.Column(db.Integer(), db.ForeignKey('team.id'))
defense_id = db.Column(db.Integer(), db.ForeignKey('team.id'))
offense = db.relationship('Team',
foreign_keys=[offense_id], backref='offensive_games')
defense = db.relationship('Team',
foreign_keys=[defense_id], backref='defensive_games')
class GameObserver(db.Model):
id = db.Column(db.Integer, primary_key=True)
observer_id = db.Column(db.Integer(), db.ForeignKey('team.id'))
game_id = db.Column(db.Integer(), db.ForeignKey('game.id'))
game = db.relationship('Game',
foreign_keys=[game_id], backref='game_watchers')
observer = db.relationship('Team',
foreign_keys=[observer_id], backref='watched_games')我找到的一个解决方案是:
db.session.query(Game.id, Team.email).filter(GameObserver.observer_id ==
Team.id).filter(GameObserver.game_id == Game.id).filter(Game.offense.has(email =
'foo@email123.com')).all()但是,我怀疑有一种更好的方法可以使用联接来完成这个任务。有人有更好的方法吗?
发布于 2016-01-09 02:05:02
这将为与您的条件匹配的每个GameObserver记录返回一行。
from sqlalchemy.orm import aliased
off_Team = aliased(Team)
obs_Team = aliased(Team)
results = db.session.query(obs_Team.email, Game.id)\
.select_from(GameObserver)\
.join(Game)\
.join(obs_Team, GameObserver.observer)\
.join(off_Team, Game.offense)\
.filter(off_Team.email == 'foo@email123.com')\
.all()https://stackoverflow.com/questions/34688555
复制相似问题