加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – SQLAlchemy查询显示错误“无法将表/可选’工作流

发布时间:2020-12-13 16:02:36 所属栏目:百科 来源:网络整理
导读:我写了一个SQL查询,我正在尝试移植到SQLAlchemy,但收到以下错误: sqlalchemy.exc.InvalidRequestError: Can't join table/selectable 'workflows' to itself SQL(工作): SELECT w.user_id,COUNT(l.id) FROM logs as lINNER JOIN workflows as w ON l.workf
我写了一个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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读