【发布时间】:2019-09-25 14:26:55
【问题描述】:
我正在尝试使用查询 API 创建一个带有 MAX_EXECUTION_TIME(30000) 提示的 MySQL 查询。
我的代码大致是:
from flask_sqlalchemy import SQLAlchemy
class MyTable(SQLAlchemy().Model):
...
base_query = Sqlalchemy.session.query(MyTable) # This works when I execute it.
base_query_with_hint = base_query.with_hint(MyTable, "MAX_EXECUTION_TIME(30000)")
base_query_with_hint.execute() # THIS DOES NOT WORK.
str(base_query_with_hint)
# Output
# Select a, b, c from MyTable MAX_EXECUTION_TIME(30000)
显然,提示只是在查询结束时呈现!
它应该呈现为
Select /*+ MAX_EXECUTION_TIME(30000) */ a, b, c from MyTable
我希望它的行为与 https://docs.sqlalchemy.org/en/13/core/selectable.html#sqlalchemy.sql.expression.Select.with_hint 完全相同,但我使用的是查询 API 而不是选择 API。
【问题讨论】:
-
我看到 MySQL 有两种类型的提示,Index Hints 和 Optimizer Hints。您的提示是优化器提示,需要使用上面的注释语法,但可能将其视为索引提示,并作为查询的一部分呈现。因此,如果这是真的,那么真正的问题是可以强制
with_hint()为 mysql 呈现优化器提示吗? -
您的查询没有问题,如果您使用 oracle 方言编译它,它会输出文档说明的方式,但显然您的方言是错误的。
from sqlalchemy.dialects import oracle; print(base_query_with_hint.statement.compile(dialect=oracle.dialect()))输出SELECT /*+ MAX_EXECUTION_TIME(30000) */ mytable.a.... -
我在 github 问题和邮件列表中搜索了“mysql with_hint”、“mysql optimizer”等术语,但没有看到任何相关内容,所以对于mailing list 来说可能是一个好问题。
-
如果你能根据邮件列表的反馈起草一个答案会很好,因为这是一个新问题。
标签: python sqlalchemy flask-sqlalchemy