Python SQLAlchemy-连接条件失败,AttributeError:none';二进制表达式';对象nor';比较器';对象具有属性';可选';

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

我在用金字塔运行SQLAlchemy。我正在尝试使用自定义“联接”条件运行查询:

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)