小编典典

如何从SQLAlchemy表达式获取原始的编译SQL查询?

mysql

我有一个SQLAlchemy查询对象,想获取已编译的SQL语句的文本,并绑定了所有参数(例如,否%s或其他变量正等待语句编译器或MySQLdb方言引擎绑定)。

调用str()查询将显示如下内容:

SELECT id WHERE date_added <= %s AND date_added >= %s ORDER BY count DESC

我试着在query._params中查找,但这是一个空字典。我使用装饰器的这个示例sqlalchemy.ext.compiler.compiles编写了自己的编译器,但是即使那里的语句仍然有%s我想要的数据。

我无法弄清楚何时混入参数来创建查询。当检查查询对象时,它们始终是一个空字典(尽管查询执行得很好,并且当您打开echo记录时引擎会打印出来)。

我开始收到消息,SQLAlchemy不想让我知道底层查询,因为它破坏了表达式API接口的所有不同DB-
API的一般性质。我不在乎查询是否在我发现查询之前就已经执行了;我只是想知道!


阅读 301

收藏
2020-05-17

共1个答案

小编典典

博客提供了更新的答案。

从博客文章中引用,建议并为我工作。

>>> from sqlalchemy.dialects import postgresql
>>> print str(q.statement.compile(dialect=postgresql.dialect()))

其中q定义为:

>>> q = DBSession.query(model.Name).distinct(model.Name.value) \
             .order_by(model.Name.value)

或者只是任何一种session.query()。

感谢Nicolas Cadou的回答!希望对其他在这里搜索的人有所帮助。

2020-05-17