sqlalchemy 2列具有相同的外键1关系-还是查询?

5lwkijsr  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(453)

我有两张table teams 以及 matches (包含的列比显示的多,但对于本例来说这些就足够了):

  1. class Teams(DBBase):
  2. __tablename__ = 'teams'
  3. team_id = Column(
  4. sqlalchemy.INTEGER,
  5. primary_key=True,
  6. autoincrement=False)
  7. sport_id = Column(
  8. sqlalchemy.INTEGER,
  9. sqlalchemy.ForeignKey("sports.sport_id"),
  10. index=True)
  11. team_type_id = Column(
  12. sqlalchemy.INTEGER,
  13. sqlalchemy.ForeignKey("team_types.team_type_id"),
  14. index=True)
  15. country_id = Column(
  16. sqlalchemy.INTEGER,
  17. sqlalchemy.ForeignKey("countries.country_id"),
  18. index=True)
  19. class Matches(DBBase):
  20. __tablename__ = 'matches'
  21. match_id = Column(
  22. sqlalchemy.INTEGER,
  23. primary_key=True,
  24. autoincrement=False)
  25. team_0_id = Column(
  26. sqlalchemy.INTEGER,
  27. sqlalchemy.ForeignKey("teams.team_id"),
  28. index=True)
  29. team_1_id = Column(
  30. sqlalchemy.INTEGER,
  31. sqlalchemy.ForeignKey("teams.team_id"),
  32. index=True)
  33. venue_id = Column(
  34. sqlalchemy.INTEGER,
  35. sqlalchemy.ForeignKey("venues.venue_id"),
  36. index=True)

我想能够访问一个球队的所有比赛,无论他们是 team_0 或者 team_1 (想回家或离开)。
在原始sql中,我可以执行以下操作: SELECT * FROM matches WHERE team_0_id = 'insert team id here' OR team_1_id = 'insert team id here' 或者我认为更理想的(速度方面):

  1. SELECT * FROM matches WHERE team_0_id = 'insert team id here'
  2. UNION
  3. SELECT * FROM matches WHERE team_1_id = 'insert team id here'

现在我想知道创建一个 relationship 在我的 Teams 上课?
我得出了以下结论:

  1. matches = relationship('Matches', primary_join="or_(Teams.team_id==Matches.team_0_id, Teams.team_id==Matches.team_1_id")

但是这不能利用 UNION . 我还想知道这是否只是糟糕的table/db设计,我应该在比赛和球队之间建立某种关联表?

eoxn13cs

eoxn13cs1#

您可以通过orm的query.union在这里使用union

  1. home_query = session.query(Matches).filter(Matches.team_0_id == 1)
  2. away_query = session.query(Matches).filter(Matches.team_1_id == 1)
  3. all_matches_where_team_participated = home_query.union(away_query).all()

哪里 session 是从sessionmaker创建的

相关问题