当 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() 方法的子查询时?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas 和 SQLAlchemy:使用来自 engine.begin() 的连接时,带有 SQLAlchemy 2.0 fututre=True 的 df.to_sql() 会引发错误