首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从SQLAlchemy表达式中获取原始的、已编译的SQL查询?

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

Stack Overflow用户
提问于 2011-01-07 00:43:06
回答 9查看 114.6K关注 0票数 138

我有一个SQLAlchemy对象,希望获得编译后的SQLAlchemy语句的文本,并绑定它的所有参数(例如,没有%s或其他变量等待语句编译器或MySQLdb方言引擎等绑定)。

在查询上调用str()会显示类似以下内容:

代码语言:javascript
复制
SELECT id WHERE date_added <= %s AND date_added >= %s ORDER BY count DESC

我试着在query._params中查找,但它是空的。我用this example of the sqlalchemy.ext.compiler.compiles decorator编写了自己的编译器,但即使是其中的语句也有我想要数据的%s

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

我开始意识到SQLAlchemy不想让我知道底层查询,因为它破坏了expression API接口的一般特性所有不同的DB-API。我不介意查询在我发现它是什么之前被执行;我只想知道它是什么!

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2014-08-29 15:24:23

This博客提供了更新的答案。

引用博客文章中的话,这对我来说是建议和有效的。

代码语言:javascript
复制
>>> from sqlalchemy.dialects import postgresql
>>> print str(q.statement.compile(dialect=postgresql.dialect()))

其中Q定义为:

代码语言:javascript
复制
>>> q = DBSession.query(model.Name).distinct(model.Name.value) \
             .order_by(model.Name.value)

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

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

票数 141
EN

Stack Overflow用户

发布于 2011-01-07 01:14:35

这应该适用于Sqlalchemy >= 0.6

代码语言:javascript
复制
from sqlalchemy.sql import compiler

from psycopg2.extensions import adapt as sqlescape
# or use the appropiate escape function from your db driver

def compile_query(query):
    dialect = query.session.bind.dialect
    statement = query.statement
    comp = compiler.SQLCompiler(dialect, statement)
    comp.compile()
    enc = dialect.encoding
    params = {}
    for k,v in comp.params.iteritems():
        if isinstance(v, unicode):
            v = v.encode(enc)
        params[k] = sqlescape(v)
    return (comp.string.encode(enc) % params).decode(enc)
票数 26
EN

Stack Overflow用户

发布于 2011-01-07 02:00:12

问题是,sqlalchemy从不将数据与查询混合在一起。查询和数据分别传递给底层数据库驱动程序-数据插值发生在数据库中。

Sqlalchemy将您在str(myquery)中看到的查询传递给数据库,值将放在一个单独的元组中。

您可以使用某种方法,通过查询自己插入数据(正如albertov下面建议的那样),但这并不是sqlalchemy正在执行的事情。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4617291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档