gpt4 book ai didi

python - SQLAlchemy 查询显示错误 "Can' t join table/selectable 'workflows' to itself”

转载 作者:太空狗 更新时间:2023-10-30 00:49:14 26 4
gpt4 key购买 nike

我写了一个 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。调试查询真的很方便。或者你可以 compile单个查询以查看生成的 SQL。

关于python - SQLAlchemy 查询显示错误 "Can' t join table/selectable 'workflows' to itself”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31766950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com