gpt4 book ai didi

python - SqlAlchemy:检查一个对象是否处于任何关系中(或_(object.relationship1.contains(otherObject),object.relationship2.contains(otherObject))

转载 作者:太空狗 更新时间:2023-10-30 00:08:25 27 4
gpt4 key购买 nike

假设我有这样一个类:

class Foo(declarativeBase):
bars1 = relationship(Bar.Bar, secondary=foos_to_bars1, collection_class=set())
bars2 = relationship(Bar.Bar, secondary=foos_to_bars2, collection_class=list())

(每个关系都为我提供了具有特定条件的“条”)。在某个时刻,我想获得在任何关系中都有一个“bar”(Bar.Bar 的实例)的“Foo”的实例。

如果我尝试这样做:

def inAnyBar(bar)
query(Foo).filter(or_(Foo.bars1.contains(bar), Foo.bars2.contains(bar)).all()

我得到一个空结果。

它看起来(对我来说)就像我在做类似的事情:

query(Foo).join(Foo.bars1).filter(Foo.bars1.contains(bar)).\
join(Foo.bars2).filter(Foo.bars1.contains(bar))

由于 Foo.bars1 不包含 bar,因此第二个过滤器给出空结果。

我已经找到了子查询的解决方法(子查询中的每个连接+过滤器,然后是 or_ 所有子查询)但我想知道是否有更好的方法...

我发现了这个: http://techspot.zzzeek.org/2008/09/09/selecting-booleans/

这就是我想做的,但它是针对 SqlAlchemy 0.5 的,我(几乎)确定有一种“更干净”的方法可以使用 SqlAlchemy 0.6.6 来完成它

谢谢!

最佳答案

你是对的,session.query(Foo).filter(Foo.bars1.contains(bar)|Foo.bars2.contains(bar)) 产生以下 SQL:

SELECT "Foo".id AS "Foo_id" 
FROM "Foo", foos_to_bars1 AS foos_to_bars1_1, foos_to_bars2 AS foos_to_bars2_1
WHERE "Foo".id = foos_to_bars1_1.foo AND ? = foos_to_bars1_1.bar OR
"Foo".id = foos_to_bars2_1.foo AND ? = foos_to_bars2_1.bar

secondary 表之一为空时返回不正确的结果。似乎是 SQLAlchemy 中的错误。但是用 any() 替换 contains() 解决了问题(它使用 EXISTS 子查询):

session.query(Foo).filter(Foo.bars1.any(id=bar.id)|Foo.bars2.any(id=bar.id))

您也可以明确指定 OUTER JOIN:

Bar1 = aliased(Bar)
Bar2 = aliased(Bar)
session.query(Foo).outerjoin((Bar1, Foo.bars1)).outerjoin((Bar2, Foo.bars2))\
.filter((Bar1.id==bar.id)|(Bar2.id==bar.id))

关于python - SqlAlchemy:检查一个对象是否处于任何关系中(或_(object.relationship1.contains(otherObject),object.relationship2.contains(otherObject)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6118783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com