当前位置: 首页 > 面试题库 >

SQLAlchemy联接来自同一表的多个列

司马作人
2023-03-14
问题内容

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'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly


问题答案:

首先,您的代码不起作用的原因是因为SQLAlchemy不知道您是否要Team通过viahome_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

m.home_team并且m.away_team将在相同的查询被装载m使用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


 类似资料:
  • 问题内容: 我正在尝试找出SQLAlchemy中正确的联接查询设置,但似乎无法解决。 我有以下表格设置(简化后,我省略了非必要字段): 因此,关系如下: 1:n Group Member 1:n Member Item 1:n Version Item 我想通过从数据库中选择具有特定版本的所有项目行来构建查询。然后,我想按组然后按成员订购。使用Flask / WTForm的输出应如下所示: 我想出

  • 问题内容: 我想添加代表其他表计数的列。 我有3张桌子。 留言内容 主题 星星_吉文 我要结束于: Topic_Review 因此,基本上我想在3列中附加唯一值的计数(每个主题中给定的星数,在主题中具有消息的唯一用户以及每个主题中的唯一消息数)。 我希望最终也能够过滤类别(在两列中均可见)。 此外,我最终希望按加入的人数进行排序。例如,我将要有一个按钮,该按钮按升序按“星数”排序,或按降序按“用户

  • 我对以下查询有问题: 这个想法是把包括邮资在内的订单总价拿回来。 已订购的项目-包括所有已订购的项目(因此可以有多行) 订单-包括订单的邮资价格(这里每个订单只有一行) 我遇到的问题是,如果订单中包含多个“ordered_items”项目,则上述金额会多次计算“orders”中的邮资。 如何重写此查询,使邮资只计算一次? 提前感谢任何帮助。

  • 问题内容: 我有一个要求,我需要限制从表返回的特定标志和所有记录的其他标志值的记录数。 例如:table有一个名为的元素,可能的值为’m’和’o’。 我只需要返回10条“ o”记录和所有“ m”记录。 我正打算为此与工会写一个查询。像这样: 这可能吗?请注意,它是一个JPA查询。(contact_history是对象名称) 任何其他更好的建议,欢迎您! 问题答案: 不,这对于JPQL是不可能的,因

  • 如何修改此ffmpeg字符串以生成具有不同视频比特率的多个输出?这是为了在yadif=1消耗大量电力时节省时间。而且,无法让它在windows中接受yadif_cuda。 ffmpeg-y-f lavfi-i anullsrc=cl=mono:sample_rate=48000-i“test.mxf”-vf yadif=1-s 1920:1080-c:v h264-nvenc-强制关键帧“expr

  • 我有一个Lambda函数,它将DynamoDB流消息推送到SNS。如果我把批量大小设为10,它可以合并两个不同流的记录吗? 例如:Stream1有一个由2个对象组成的数组,Stream2也有一个由2个对象组成的数组。如果我将批大小设置为10,lambda会创建2个批(每个流一个),还是将两个流的对象合并并将它们放在单个批下。假设两条流同时到达Lambda。