SQLAlchemy - 连接条件因 AttributeError 失败:“BinaryExpression”对象和“Comparator”对象都没有属性“selectable”

问题描述 投票:0回答:4

我正在使用 Pyramid 运行 SQLAlchemy。我正在尝试使用自定义“加入”条件运行查询:

DBSession.query(A)\
        .outerjoin(A.b, B.a_id == A.id)\
        .all()

但是查询失败并出现以下错误:

AttributeError:“BinaryExpression”对象和“Comparator”对象都没有属性“selectable”

问题源于条件,就好像我删除它一样,查询有效:

DBSession.query(A)\
        .outerjoin(A.b)\
        .all()

我不明白这个问题,因为我遵循文档中描述的语法:

q = session.query(User).join(Address, User.id==Address.user_id)

有人看到发生了什么吗?

python sqlalchemy pyramid
4个回答
25
投票

好的,我看到了。 如果添加自定义条件,则语法不是

.outerjoin(A.b, ...)
,而是
.outerjoin(B, ...)

他们应该接受两者,真的

(并且错误消息可能一点更明确)


4
投票

此错误的另一个可能原因是

join()
的显式 ON 子句的使用不正确:显式 ON 子句应该是单个表达式。因此,如果您打算在 ON 子句中使用多个过滤器,则应将它们与
and_
/
or_
结合使用。例如,如果你想在连接的 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

Query.join() SQLA API 文档本身非常详细,但在摘要中有些含糊(它说它是

join(*args, **kwargs)
,这没有多大帮助)。这里是some
Query.join()
正确用途的总结:

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

在上面的所有示例中,除了第一个:

  • 带有明确的 ON 子句,
    A
    B
    不仅可以是映射器类,还可以是任何“可选择的”类:
    subquery()
    Table
    的实例或别名 (
    aliased(selectable)
    ) 都可以。
  • 没有显式的 ON 子句
    A
    B
    只能是映射器类或
    Table
    实例

0
投票

另一种说法是,如果您已经通过

.outerjoin(A.b...
指定了关系,则不再需要指定条件,实际上不能同时执行这两项操作。


0
投票

对我来说,一旦我尝试

PATCH
在我的数据库中连续,我就遇到了这个问题,我直接从 SqlAlchemy2 文档 中获取代码,并尝试对其进行调整

from sqlalchemy import update as sqlalchemy_update

query = sqlalchemy_update(DimensionsEvaluation).where(
                DimensionsEvaluation.id == id).values(DimensionsEvaluation.selected == True)

但是我得到了这个错误:

Neither 'BinaryExpression' object nor 'Comparator' object has an attribute 'items' 

要解决这个问题,我只需像这样使用

values
的字典

    query = sqlalchemy_update(DimensionsEvaluation).where(
                DimensionsEvaluation.id == id).values({
                    "selected": True
                })

查看此链接了解更多详情https://www.geeksforgeeks.org/sqlalchemy-core-update-statement/

© www.soinside.com 2019 - 2024. All rights reserved.