SQLAlchemy MySQL STRAIGHT_JOIN

时间:2013-05-21 11:26:46

标签: python mysql sqlalchemy

我的代码目前在SQLAlchemy ORM层执行查询就好了:

session().query(model_a).join(
    (model_b, something == somethingelse)
).join(
    (model_c, something == somethingelse)
) # etc ...

但是我遇到了一个需要几分钟才能完成的查询。事实证明,MySQL应该受到责备,因为它没有按照我们要求的顺序加入。在STRAIGHT_JOIN之后添加SELECT

SELECT STRAIGHT_JOIN table_a.id FROM table_a INNER JOIN table_b ...

修复了问题,但我无法弄清楚是否有办法让SQLAlchemy在STRAIGHT_JOIN之后添加SELECT。文档建议可以通过select()将提示添加到with_hint(table_a, "STRAIGHT_JOIN"),但这会将文本添加到错误的位置,从而导致MySQL语法错误。这也可能涉及到不理想的ORM之外。

我尝试过使用各种MySQL调试技术,如EXPLAINANALYZE TABLE等......但似乎无法找出MySQL选择错误路径的原因。手动切换连接顺序似乎也没有帮助,所以我现在处于需要让STRAIGHT_JOIN工作的位置。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我们直接支持这种情况只是针对MySQL及其奇怪的关键字:

session().query(model_a).prefix_with("STRAIGHT_JOIN").join(
    (model_b, something == somethingelse)
).join(
    (model_c, something == somethingelse)
) # etc ...

http://docs.sqlalchemy.org/en/rel_0_8/orm/query.html?highlight=query.prefix_with#sqlalchemy.orm.query.Query.prefix_with