我正在使用 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)
有人看到发生了什么吗?
好的,我看到了。 如果添加自定义条件,则语法不是
.outerjoin(A.b, ...)
,而是.outerjoin(B, ...)
他们应该接受两者,真的
(并且错误消息可能一点更明确)
此错误的另一个可能原因是
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)
在上面的所有示例中,除了第一个:
A
和 B
不仅可以是映射器类,还可以是任何“可选择的”类:subquery()
,Table
的实例或别名 (aliased(selectable)
) 都可以。 A
和 B
只能是映射器类或 Table
实例另一种说法是,如果您已经通过
.outerjoin(A.b...
指定了关系,则不再需要指定条件,实际上不能同时执行这两项操作。
对我来说,一旦我尝试
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/