多対多の関連付けとデータベースの関係がありますが、関連付けテーブル自体にアクセスする必要のある属性が多数含まれているため、次の3つのクラスを作成しました。
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
1つの特定のユーザーが1つの課題に取り組んでいることを示す表です。
今の問題:すべてのユーザーにクエリを実行してから、各試行を確認すると、完全に問題ありません。しかし、私がこの試みの挑戦を見るとき、それは多くのサブクエリで爆発します。もちろん、これはパフォーマンスに悪影響を及ぼします。
私がSQLAlchemyに実際に求めているのは、すべての(または関連するすべての)チャレンジを一度にプルして、それを関連する試行に関連付けることです。チャレンジの数は100から500の間しかないため、すべてのチャレンジがプルされるか、後で実際に関連付けられるチャレンジのみがプルされるかは大した問題ではありません。
現在の私のソリューションは、実際にはあまりエレガントではありません。関連するすべての試行、チャレンジ、およびユーザーを個別にプルしてから、手動で関連付けます。すべての試行をループし、チャレンジとユーザーに追加を割り当ててから、チャレンジとユーザーも試行に追加します。 。それは、必要ではないはずの残忍な解決策のように私には思えます。
ただし、すべてのアプローチ(たとえば、「遅延」パラメーターの変更、クエリの変更など)により、クエリは数百から数千になります。私はまた、希望する結果が得られ、それに沿ってうまく機能SQL
する何かを思いついたプレーンなクエリを書こうとしましたが、それをに翻訳することはできませんSELECT * FROM challenge WHERE id IN (SELECT challenge_id FROM attempts)
SQLAlchemy
あなたが提供しなければならないかもしれないどんな指導にも前もって感謝します。