使用提示时,SQLAlChemy查询API无法正常工作

人气:1,330 发布:2022-10-16 标签: python sqlalchemy flask-sqlalchemy

问题描述

我正在尝试使用查询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
>>>

444