我写了一个 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))
将Workflow
和Log
添加到您的查询中。第一个模型被标记为主表,其他模型被标记为次要表。如果之后没有调用 .join()
,则主表和辅助表都将添加到 FROM
子句中。如果有对 .join()
的调用,它会将接收到的表移动到 JOIN
子句。这里重要的是 .join()
只能应用于副表。
问题是你调用
.join(Workflow, Workflow.id == Log.workflow_id)
尝试将主表标记为已连接。要解决问题,您需要加入辅助表:
.join(Log, Workflow.id == Log.workflow_id)
您可以添加 echo=True
查看 SQLAlchemy 生成的 SQL。调试查询真的很方便。或者你可以 compile单个查询以查看生成的 SQL。
关于python - SQLAlchemy 查询显示错误 "Can' t join table/selectable 'workflows' to itself”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31766950/