SQLAlchemy:Joinload +限制

jba*_*tos 5 python sql sqlalchemy subquery limit

给出以下声明:

p = db.query(Profile).options(joinedload('*')).filter_by(id=p.id).limit(1).one()
Run Code Online (Sandbox Code Playgroud)

我将得到一个子查询+一个联接,而不是一个“纯”联接:

SELECT [...] 
FROM (SELECT profile.id AS profile_id, ...
FROM profile 
WHERE profile.id = %(id_1)s 
LIMIT %(param_1)s) AS anon_1 LEFT OUTER JOIN city AS city_1 ON city_1.id = anon_1.profile_city LEFT OUTER JOIN country AS country_1 ON country_1.id = city_1.country LEFT OUTER JOIN state AS state_1 ON country_1.id = state_1.country LEFT OUTER JOIN state AS state_2 ON state_2.id = city_1.state LEFT OUTER JOIN country AS country_2 ON country_2.id = state_2.country LEFT OUTER JOIN state AS state_3 ON state_3.id = city_1.state LEFT OUTER JOIN country AS country_3 ON country_3.id = state_3.country LEFT OUTER JOIN starred AS starred_1 ON anon_1.profile_id = starred_1.star LEFT OUTER JOIN profiletext AS profiletext_1 ON anon_1.profile_id = profiletext_1.profile LEFT OUTER JOIN starred AS starred_2 ON anon_1.profile_id = starred_2.idprofile LEFT OUTER JOIN photo AS photo_1 ON anon_1.profile_id = photo_1.profile LEFT OUTER JOIN gps AS gps_1 ON anon_1.profile_id = gps_1.idprofile
Run Code Online (Sandbox Code Playgroud)

但我真正需要的是:

SELECT ...
FROM profile LEFT OUTER JOIN city AS city_1 ON city_1.id = profile.city LEFT OUTER JOIN country AS country_1 ON country_1.id = city_1.country LEFT OUTER JOIN state AS state_1 ON country_1.id = state_1.country LEFT OUTER JOIN state AS state_2 ON state_2.id = city_1.state     
LEFT OUTER JOIN country AS country_2 ON country_2.id = state_2.country LEFT OUTER JOIN state AS state_3 ON state_3.id = city_1.state LEFT OUTER JOIN country AS country_3 ON country_3.id = state_3.country LEFT OUTER JOIN starred AS starred_1 ON profile.id = starred_1.star LEFT OUTER JOIN profiletext AS profiletext_1 ON profile.id = profiletext_1.profile LEFT OUTER JOIN starred AS starred_2 ON profile.id = starred_2.idprofile LEFT OUTER JOIN photo AS photo_1 ON profile.id = photo_1.profile LEFT OUTER JOIN gps AS gps_1 
ON profile.id = gps_1.idprofile                                                                                                                                                                                                    
WHERE profile.id = 4 
limit 1;
Run Code Online (Sandbox Code Playgroud)

即没有子查询。

数据库:PostgreSQL 9.2

Ben*_*Ben 3

根据《The Zen of Eager Loading》,这似乎是预期的行为

\n\n
\n

使用联接急切加载时,如果查询包含影响从外部返回到联接的行的修饰符,例如使用 DISTINCT、LIMIT、OFFSET 或等效项时,则完成的语句首先包装在子查询中,并且专门用于连接急切加载的连接将应用于子查询。SQLAlchemy\xe2\x80\x99s 加入\n 急切加载会加倍努力,然后再进一步,\n 绝对确保它不会影响查询的最终结果,\n 只影响集合和相关对象的方式已加载,无论\n 查询的格式是什么。

\n
\n\n

我意识到这是一个老问题,但是生成的 SQL 不起作用有什么原因吗?

\n