python - SQLAlchemy 连接来自同一个表的多个列

标签 python sql join sqlalchemy

class Match(Base):
    __tablename__ = 'matches'

    id = Column(Integer, primary_key=True)
    date = Column(Date, nullable=False)
    time = Column(Time, nullable=True)
    league_id = Column(ForeignKey('leagues.id'), nullable=False, index=True)
    league = relationship('League', backref='matches')
    type = Column(enums.matches_types)
    home_team_id = Column(ForeignKey('teams.id'), nullable=False, index=True)
    home_team = relationship('Team', foreign_keys=[home_team_id], backref='home_matches')
    away_team_id = Column(ForeignKey('teams.id'), nullable=False, index=True)


class Team(Base):
    __tablename__ = 'teams'

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    country_id = Column(ForeignKey('countries.id'), nullable=False, index=True)
    country = relationship('Country', backref='teams')

我需要编写一个连接列和团队表的查询,以显示本地团队和客场团队的团队信息。

Session.query(Match.date, Match.home_team.name, Match_away_team.name).joins(Team)

这将返回 Can't determine join between 'matches' and 'teams';表之间有多个外键约束关系。请明确指定此连接的“onclause”

最佳答案

首先,您的代码不起作用的原因是 SQLAlchemy 不知道您是否要加入 Team通过home_teamaway_team ,所以你必须告诉它。此外,您需要加入 Team两次,这使事情更加复杂。

使用 joinedload 可以更轻松地完成此操作:

matches = session.query(Match).options(joinedload(Match.home_team),
                                       joinedload(Match.away_team))
for m in matches:
    print m.date, m.home_team, m.away_team

m.home_teamm.away_team将在与 m 相同的查询中加载使用 JOIN .

如果您坚持使用明确的 .join()你必须 alias Team实体(未测试):

home = aliased(Team)
away = aliased(Team)
q = session.query(Match.date, home, away).join(home, Match.home_team) \
                                         .join(away, Match.away_team)
for date, home_team, away_team in q:
    print date, home_team, away_team

关于python - SQLAlchemy 连接来自同一个表的多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35327701/

相关文章:

sql - Access 查询表的更新

mysql - 从 Xoops 数据库中计算并插入评论

javascript - 从 JavaScript 将日期传递给 ADODB.Command 参数

PHP MySQL : Fetching all associated rows from multiple tables using one query?

python - Tkinter 和 Tic-Tac-Toe 的问题

python - 如何有效地在具有不同维度的多维 numpy 数组中添加列?

Python:获取实例化类的名称?

join - 使用 Hive 有效地连接不同列上的同一个表

mysql - 正确连接多个多对多表 - MySQL 查询

python - 如何有效地对 pandas DataFrame 中的行组合进行采样