我有一个多对多关联的数据库关系,但是关联表本身包含很多需要访问的属性,所以我做了三个类:
class User(Base):
id = Column(Integer, primary_key=True)
attempts = relationship("UserAttempt", backref="user", lazy="subquery")
class Challenge(Base):
id = Column(Integer, primary_key=True)
attempts = relationship("UserAttempt", backref="challenge", lazy='subquery')
class UserAttempt(Base):
challenge_id = Column(Integer, ForeignKey('challenge.id'), primary_key=True)
user_id = Column(Integer, ForeignKey('user.id'), primary_key=True)
当然,这是一个简化的案例,我忽略了需要访问的其他属性。这里的目的是,每个人都User
可以尝试任意数量的Challenge
s,因此该UserAttempt
表描述了一个特定用户完成一项挑战。
现在的问题:当我查询所有用户然后查看每次尝试时,我完全没问题。但是当我看到这个尝试的挑战时,它会在无数子查询中爆炸。当然,这对性能不利。
我真正想从 SQLAlchemy 中提取所有(或所有相关)挑战,然后将其与相关尝试相关联。如果所有挑战都被取消或仅在以后有实际关联的挑战被取消,这没什么大不了的,因为挑战的数量仅在 100-500 之间。
我现在的解决方案实际上不是很优雅:我分别提取所有相关的尝试、挑战和用户,然后手动关联:循环所有尝试并将添加分配给挑战和用户,然后将挑战和用户也添加到尝试. 在我看来,这似乎是一个不必要的残酷解决方案。
然而,每种方法(例如,不同的“惰性”参数、更改的查询等)都导致了数百到数千个查询。我还尝试编写简单的SQL
查询来产生我想要的结果,并提出了一些类似的东西SELECT * FROM challenge WHERE id IN (SELECT challenge_id FROM attempts)
并且效果很好,但我无法将它翻译成SQLAlchemy
非常感谢您提前提供的任何指导。