为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

九州编程 2019-11-11 13:10:59
我有一个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的一般性质。我不在乎查询是否在我发现查询之前就已经执行了;我只是想知道!
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

这应该适用于Sqlalchemy> = 0.6


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)


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 1080 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信