当 SQLAlchemy 决定使用带有 .limit() 方法的子查询时?

Posted

技术标签:

【中文标题】当 SQLAlchemy 决定使用带有 .limit() 方法的子查询时?【英文标题】:When SQLAlchemy decides to use subquery with .limit() method? 【发布时间】:2015-10-12 14:02:28 【问题描述】:

我有一个错误,当 SQLAlchemy 产生错误的 SQL 查询时,我无法确定条件。

我使用 Flask-SQLAlchemy,最初它只是一个 MyModel.query,它由带有 JOIN 的简单 SELECT 表示。但是当应用 .limit() 方法时,它会转换并使用子查询来获取主要对象,然后才应用 JOIN。问题出在 ORDER BY 语句中,该语句保持不变并忽略子查询定义。

这里是示例,我已经简化了选择字段:

-- Initially
SELECT *
FROM customer_rates
LEFT OUTER JOIN seasons AS seasons_1 ON seasons_1.id = customer_rates.season_id
LEFT OUTER JOIN users AS users_1 ON users_1.id = customer_rates.customer_id
-- other joins ...
ORDER BY customer_rates.id, customer_rates.id

-- Then .limit()
SELECT anon_1.*, *
FROM (
    SELECT customer_rates.*
    FROM customer_rates
    LIMIT :param_1) AS anon_1
LEFT OUTER JOIN seasons AS seasons_1 ON seasons_1.id = anon_1.customer_rates_season_id
LEFT OUTER JOIN users AS users_1 ON users_1.id = anon_1.customer_rates_customer_id
-- other joins
ORDER BY customer_rates.id, customer_rates.id

这个查询给出了以下错误:

ProgrammingError: (psycopg2.ProgrammingError) missing FROM-clause entry for table "customer_rates"

查询的最后一行应该是:

ORDER BY anon_1.customer_rates_id

产生此查询的代码是大型应用程序的一部分。我试图在一个小烧瓶应用程序中从头开始实现它,但我无法重现它。在小型应用程序中,它总是使用 JOIN。 所以我需要知道,什么时候 SQLAlchemy 决定使用子查询。

我使用 python 2.7 和 PostgreSQL 9

【问题讨论】:

【参考方案1】:

答案很简单。当连接表与查询模型具有多对一关系时,它使用子查询。因此,为了产生正确数量的结果,它限制了子查询中的查询行

【讨论】:

以上是关于当 SQLAlchemy 决定使用带有 .limit() 方法的子查询时?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写带有联接和聚合的 SQLAlchemy 查询?

Pandas 和 SQLAlchemy:使用来自 engine.begin() 的连接时,带有 SQLAlchemy 2.0 fututre=True 的 df.to_sql() 会引发错误

k8s -深入了解 Pod

k8s -深入了解 Pod

k8s -深入了解 Pod

k8s -深入了解 Pod