首先,数据库概述:帮助与复杂的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_id
和leader_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
)