1

私は次のクラスを持っています:

Class User(Base):
    #user properties

Class Item(Base):
    #item properties

Class User_Item(Base):
    __tablename__='users_items'
    id=Column(Integer, primary_key=True)
    user_id=Column(Integer, ForeignKey('users.id'))
    item_id=Column(Integer, ForeignKey('items.id'))
    info=Column(String(20))
    user=relationship(User,backref='items',primaryjoin=(User.id==user_id))
    item=relationship(Item, backref='users',primaryjoin=(Item.id==item_id))

次の2つのクエリの違いは何ですか:

result1= session.query(Item).options(joinedload(Item.users)).filter(Item.users.any(user=user1)

また

result2=session.query(Item).join(Item.users).filter(Item.users.any(user=user1))

どういうわけか、2番目のものは奇妙に見えます! user1 が 2 つのアイテムを持っているとしましょう。running はresult1.count()予想どおり 2 を返しますが、result2.count()3 を返します! ながら、len(result2.all())2です!何が起こっているのか、誰か教えてもらえますか?! :D

4

1 に答える 1

0

を使用した最初のアプローチは、クエリの実行後に がjoinedloadどのようにロードされるかのみを定義するため、明らかに望ましくありません(「リレーションシップ ロード テクニック」を参照)。item.users

結合では、contains代わりに次を使用する必要がありますany

result3 = session.query(Item).join(Item.users).filter(Item.users.contains(user1))

anyあなたのバージョンでは、結合結果ごとに複数の行が生成されると思います。echo=Trueこれは、生成された SQL (エンジン構成で設定)を調べることで確認できます。

編集

多対多の関係を間違って定義している可能性があります。これが本当の問題になる可能性があります。あなたのバージョンUser.itemsItem.usersは、代わりに User または Item を指してUser_Itemいますが、あなたはそれを認識していないと思います。

関連オブジェクト パターンと、それを単純化する方法を確認する必要があります。

于 2013-01-15T21:51:30.187 に答える