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))

现在以下两个查询有什么区别:

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))

由于某种原因,第二个看起来很奇怪!假设 user1 有两个项目,运行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每个连接结果都会产生多行。您可以通过检查生成的 SQL(echo=True在引擎配置上设置)来验证这一点。

编辑

您可能错误地定义了多对多关系,这可能是真正的问题。在您的版本中User.items,并且Item.users都指向User_Item用户或项目,我认为您没有意识到这一点。

您应该查看关联对象模式以及如何简化它

于 2013-01-15T21:51:30.187 回答