问题描述
我正在尝试使用查询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完全相同,但我使用的是Query API而不是Select API。
推荐答案
简而言之,改用prefix_with()
。
这里有一个类似的MySQL5.7优化器提示示例,来自SQLAlchemy documentation,在Python交互提示符中运行:
>>> from sqlalchemy.sql import select, table
>>> from sqlalchemy.dialects import mysql
>>> tbl = table('my_table')
>>> # MySQL 5.7 optimizer hints
>>> stmt = select([tbl]).prefix_with(
... "/*+ MAX_EXECUTION_TIME(1000) */", dialect="mysql")
>>> print(stmt.compile(dialect=mysql.dialect()))
SELECT /*+ MAX_EXECUTION_TIME(1000) */
FROM my_table
>>>