【问题标题】:When SQLAlchemy decides to use subquery with .limit() method?当 SQLAlchemy 决定使用带有 .limit() 方法的子查询时?
【发布时间】: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

【问题讨论】:

    标签: python sql postgresql sqlalchemy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 1970-01-01
      • 2014-10-08
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      相关资源
      最近更新 更多