Python SQLAlchemy-连接条件失败,AttributeError:none';二进制表达式';对象nor';比较器';对象具有属性';可选';
我在用金字塔运行SQLAlchemy。我正在尝试使用自定义“联接”条件运行查询:Python SQLAlchemy-连接条件失败,AttributeError:none';二进制表达式';对象nor';比较器';对象具有属性';可选';,python,sqlalchemy,pyramid,Python,Sqlalchemy,Pyramid,我在用金字塔运行SQLAlchemy。我正在尝试使用自定义“联接”条件运行查询: DBSession.query(A)\ .outerjoin(A.b, B.a_id == A.id)\ .all() 但是,查询失败,出现以下错误: AttributeError:“BinaryExpression”对象和“Comparator”对象都没有“可选”属性 问题源于该条件,如果我将其删除,查询将起作用: DBSession.query(A)\ .out
DBSession.query(A)\
.outerjoin(A.b, B.a_id == A.id)\
.all()
但是,查询失败,出现以下错误:
AttributeError:“BinaryExpression”对象和“Comparator”对象都没有“可选”属性
问题源于该条件,如果我将其删除,查询将起作用:
DBSession.query(A)\
.outerjoin(A.b)\
.all()
我不理解这个问题,因为我遵循中描述的语法:
q=session.query(User.join)(地址,User.id==Address.User\u id)
有人看到发生了什么吗?好的,我看到了。
如果添加自定义条件,则语法不是.outerjoin(a.b,…)
,而是.outerjoin(b,…)
他们应该两个都接受,真的
(错误信息可能更明确一些)另一种说法是,如果您已经通过
.outerjoin指定了关系(A.b.
,您不再需要指定条件,事实上不能同时指定这两个条件。此错误的另一个可能原因是对join()不正确使用explicit ON子句
:显式ON子句应该是一个表达式。因此,如果您打算在ON子句中使用多个筛选器,则它们应该与和
/或
组合。例如,如果您希望在ON子句中为联接设置附加条件:
query(A).join(B, A.b_id = B.id, A.x > N) # WRONG!
query(A).join(B, and_(A.b_id = B.id, A.x > N)) # CORRECT
它本身非常详细,但在摘要中有些模糊(它说它是
join(*args,**kwargs)
,这没有多大帮助)。下面是Query.join()的一些正确用法的摘要:
除第一个示例外,在上述所有示例中:
- 使用显式ON子句,
A
和B
不仅可以是映射器类,而且可以是任何“可选的”:subquery()
,表的实例或别名(别名(可选)
)就可以了
- 如果没有显式ON子句,则
A
和B
只能是映射器类或表
实例
三年后,你回答了自己的问题,拯救了一个陌生人,你真是个圣人。我需要使用和
。谢谢你的洞察力!
# declare the join using own field which leads to the related object:
query(A).join(A.b)
# declare the join using a class of the related mapper:
query(A).join(B)
# same as above (using related mapper class) but use explicit ON clause
# ON clause can be any/"complex" expression
query(A).join(B, A.b_id = B.id)
query(A).join(B, _and(A.b_id = B.id, ...))
# reverse the order of the join (useful to do a right outer join for example):
query(A).select_entity_from(B).join(A, isouter=True)