2011-04-28 65 views
1

首先,数据库概述:帮助与复杂的SQL炼金术加入

  • competitors - 人谁竞争
  • competitions - 事情,人们在
  • competition_registrations竞争 - 为特定的竞争
  • 登记竞争对手event - 比赛中的“事件”。
  • events_couples - 一对夫妇(2名竞争对手)参加比赛。

首先,EventCouple,对应于events_couples Python类,方法是:

class EventCouple(Base): 
    __tablename__ = 'events_couples' 

    competition_id = Column(Integer, ForeignKey('competitions.id'), primary_key=True) 
    event_id = Column(Integer, ForeignKey('events.id'), primary_key=True) 

    leader_id = Column(Integer) 
    follower_id = Column(Integer) 

    __table_args__ = (
     ForeignKeyConstraint(['competition_id', 'leader_id'], ['competition_registrations.competition_id', 'competition_registrations.competitor_id']), 
     ForeignKeyConstraint(['competition_id', 'follower_id'], ['competition_registrations.competition_id', 'competition_registrations.competitor_id']), 
     {} 
    ) 

我有一个Python类,CompetitorRegistration,对应于记录/行中competition_registrations。已注册的竞争对手可以参与多项活动,但无论是作为“领导者”还是“追随者”。我想添加到CompetitorRegistration属性leading,这是EventCouple列表competition_idleader_id匹配。这是我的CompetitorRegistration类,完整的企图:

class CompetitorRegistration(Base): 
    __tablename__ = 'competition_registrations' 

    competition_id = Column(Integer, ForeignKey('competitions.id'), primary_key=True) 
    competitor_id = Column(Integer, ForeignKey('competitors.id'), primary_key=True) 
     email = Column(String(255)) 
    affiliation_id = Column(Integer, ForeignKey('affiliation.id')) 
    is_student = Column(Boolean) 
    registered_time = Column(DateTime) 
    leader_number = Column(Integer) 

    leading = relationship('EventCouple', primaryjoin=and_('CompetitorRegistration.competition_id == EventCouple.competition_id', 'CompetitorRegistration.competitor_id == EventCouple.leader_id')) 
    following = relationship('EventCouple', primaryjoin='CompetitorRegistration.competition_id == EventCouple.competition_id and CompetitorRegistration.competitor_id == EventCouple.follower_id') 

不过,我得到:

ArgumentError: Could not determine relationship direction for primaryjoin 
condition 'CompetitorRegistration.competition_id == EventCouple.competition_id 
AND CompetitorRegistration.competitor_id == EventCouple.leader_id', on 
relationship CompetitorRegistration.leading. Ensure that the referencing Column 
objects have a ForeignKey present, or are otherwise part of a 
ForeignKeyConstraint on their parent Table, or specify the foreign_keys parameter 
to this relationship. 

感谢您的帮助,&让我知道是否需要对架构的更多信息。

此外,我的另一个尝试是在following可见 - 这并没有错误,但也没有给出正确的结果。 (它只加入了competition_id,完全忽略了follower_id

回答

0

你的leading的条件混合了表达式和字符串为eval() ed。并且following的条件将Python和SQL运算符混合在一起:Python中的and与您在此期望的不符。以下是使用两种变体的更正示例:

leading = relationship('EventCouple', primaryjoin=(
    (competition_id==EventCouple.competition_id) & \ 
    (competitor_id==EventCouple.leader_id))) 

leading = relationship('EventCouple', primaryjoin=and_(
    competition_id==EventCouple.competition_id, 
    competitor_id==EventCouple.leader_id)) 

following = relationship('EventCouple', primaryjoin=\ 
    '(CompetitorRegistration.competition_id==EventCouple.competition_id) '\ 
    '& (CompetitorRegistration.competitor_id==EventCouple.follower_id)')