繁体   English   中英

SQLAlchemy查询显示错误“无法将表/可选'工作流'连接到自身”

[英]SQLAlchemy query shows error “Can't join table/selectable 'workflows' to itself”

我写了一个SQL查询,我正在尝试移植到SQLAlchemy,但收到以下错误:

sqlalchemy.exc.InvalidRequestError: Can't join table/selectable 'workflows' to itself

SQL(工作):

SELECT
   w.user_id, COUNT(l.id) 
FROM
   logs as l
INNER JOIN
   workflows as w 
   ON l.workflow_id = w.id
WHERE
   l.type = 's'
   AND l.timestamp > extract(epoch from now()) - 86400
GROUP BY
   w.user_id;

SQLAlchemy(不工作):

session.query(
   Workflow.user_id, func.count(Log.id)
).join(
   Workflow, Workflow.id == Log.workflow_id
).filter(
   Log.type == 's', Log.timestamp > time.time() - 86400
).group_by(
   Workflow.user_id
).all()

这是预期的输出:

+----------+---------+
|  user_id |  count  |
+----------+---------+
| 1        | 5       |
| 2        | 10      |
+----------+---------+

我究竟做错了什么?

部分

.query(Workflow.user_id, func.count(Log.id))

WorkflowLog添加到您的查询中。 第一个模型标记为主表,其他模型标记为辅助表。 如果之后没有调用.join() ,则主表和辅助表都将添加到FROM子句中。 如果调用.join()它会将它接收的表移动到JOIN子句。 这里重要的是.join()只能应用于辅助表。

问题是你的电话

.join(Workflow, Workflow.id == Log.workflow_id)

尝试将主表标记为已连接。 要解决问题,您需要加入辅助表:

.join(Log, Workflow.id == Log.workflow_id)

您可以添加echo=True以查看SQLAlchemy生成的SQL。 调试查询非常方便。 或者您可以编译单个查询以查看生成的SQL。

如前所述,查询的主要实体是Workflow ,因此连接尝试将Workflow连接到自身,这是不可能的,至少在没有使用别名的情况下是这样。

除了简单地重新排序连接之外,您还可以使用Query.select_from()显式控制连接的左侧:

session.query(
    Workflow.user_id, func.count(Log.id)
).select_from(
    Log
).join(
    Workflow, Workflow.id == Log.workflow_id
).filter(
    Log.type == 's', Log.timestamp > time.time() - 86400
).group_by(
    Workflow.user_id
).all()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM