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

标签 python 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
).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/

相关文章:

python - 在持久化之前从 SQLAlchemy session 中删除对象

python - NoSuchModuleError : Can't load plugin: sqlalchemy. 方言:雪花

sql - 在两个不同的字段中选择具有共享值的行

python - 如何在 Flask-SQLAlchemy 中进行多对多查询?

python - 提供存储在 SQLAlchemy LargeBinary 列中的图像

php - PostgreSQL 数据库似乎不适用于 GeoServer

python - Python 中的随机选择机器学习代码

python - 从python 3中的pygame表面在tkinter中加载图像

用于基于文本的游戏的 Python GUI 工具包?

postgresql - Postgres 上的多边形插入问题(由于 SRID)