【问题标题】:SQLAlchemy query API not working correctly with hintsSQLAlchemy 查询 API 无法与提示一起正常工作
【发布时间】: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 HintsOptimizer 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


【解决方案1】:

简而言之,请改用prefix_with()

这是来自SQLAlchemy documentation 的 MySQL 5.7 优化器提示的类似示例,在 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
>>>

【讨论】:

    猜你喜欢
    • 2014-02-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多