我写了一个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] 举报,一经查实,本站将立刻删除。