Python SQLAlchemy-如何查询3个表(带关联表)

Python SQLAlchemy-如何查询3个表(带关联表),python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我有3个表(SQLAlchemy类):团队、游戏和游戏观察者。每场比赛有2个比赛队(进攻和防守),但有许多观察队 什么查询将返回攻击性团队电子邮件所在的所有比赛观察员(团队)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 Ga

我有3个表(SQLAlchemy类):团队、游戏和游戏观察者。每场比赛有2个比赛队(进攻和防守),但有许多观察队

什么查询将返回攻击性团队电子邮件所在的所有比赛观察员(团队)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()

然而,我怀疑有一种更好的方法可以使用连接来实现这一点。有谁有更好的方法吗?

这应该会为每个符合您标准的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()

您希望有一个单一的非重复团队列表,还是每个实际的游戏观察记录?我希望输出包含两列(观察者团队电子邮件和游戏id),每个观察者游戏包含一行。所以我猜是后者。太好了!这很接近。。。唯一的更改是别名需要从sqlalchemy.orm导入,而不是从sqlalchemy导入。我很好奇哪种方法(加入或不加入)更有效。它们都产生相同的输出,但幕后发生了什么?随着应用程序的扩展,哪一个将产生更好的性能?谢谢你,布兰登!