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

oko*_*oko 5 python postgresql sqlalchemy

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

sqlalchemy.exc.InvalidRequestError: Can't join table/selectable 'workflows' to itself
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

这是预期的输出:

+----------+---------+
|  user_id |  count  |
+----------+---------+
| 1        | 5       |
| 2        | 10      |
+----------+---------+
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Yar*_*min 8

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

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


您可以添加.join()以查看SQLAlchemy生成的SQL.调试查询非常方便.或者您可以编译单个查询以查看生成的SQL.