首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy -如何查询3个表(使用关联表)

SQLAlchemy -如何查询3个表(使用关联表)
EN

Stack Overflow用户
提问于 2016-01-09 01:01:50
回答 1查看 1.8K关注 0票数 3

我有三个表(SQLAlchemy类):团队、游戏和GameObserver。每场比赛都有两个比赛小组(攻防),但有很多观察队。

什么查询会返回所有的观察员(队)的游戏,其中的攻击队电子邮件是foo@email123.com?

代码语言:javascript
复制
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')

我找到的一个解决方案是:

代码语言:javascript
复制
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()

但是,我怀疑有一种更好的方法可以使用联接来完成这个任务。有人有更好的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-09 02:05:02

这将为与您的条件匹配的每个GameObserver记录返回一行。

代码语言:javascript
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34688555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档