Fra*_*tia 6 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')
Run Code Online (Sandbox Code Playgroud)
我需要编写一个连接列和团队表的查询,显示本地和远程团队的团队信息.
Session.query(Match.date, Match.home_team.name, Match_away_team.name).joins(Team)
Run Code Online (Sandbox Code Playgroud)
这回来了 Can't determine join between 'matches' and 'teams'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly
uni*_*rio 10
首先,你的代码不起作用的原因是因为SQLAlchemy不知道你是否想要加入Teamvia home_team或者away_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
Run Code Online (Sandbox Code Playgroud)
m.home_team并将m.away_team与m使用a 相同的查询加载JOIN.
如果您坚持使用显式.join(),则必须对实体进行别名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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5474 次 |
| 最近记录: |