微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我写了一个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
).where(
   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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐