Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlalchemy 检索最终sql查询语句(用值替换任何';?';)_Sqlalchemy_Pyramid - Fatal编程技术网

Sqlalchemy 检索最终sql查询语句(用值替换任何';?';)

Sqlalchemy 检索最终sql查询语句(用值替换任何';?';),sqlalchemy,pyramid,Sqlalchemy,Pyramid,由于将有缺陷的sql查询直接粘贴到数据库管理工具(如phpmyadmin)中,以便在返回预期结果之前对其进行处理,可能会非常有效, 是否有任何方法可以检索Sqlalchemy Core假定传递给MySql数据库的最终sql语句,以随时可以执行的形式?这通常意味着您希望绑定的参数以内联方式呈现。对此自动提供的支持有限(从SQLA 0.9开始,这将起作用): 此外,您可能希望查询是特定于MySQL的,因此,如果您已经有了一个引擎,您也可以将其传入: from sqlalchemy import cr

由于将有缺陷的sql查询直接粘贴到数据库管理工具(如phpmyadmin)中,以便在返回预期结果之前对其进行处理,可能会非常有效,
是否有任何方法可以检索Sqlalchemy Core假定传递给MySql数据库的最终sql语句,以随时可以执行的形式?

这通常意味着您希望绑定的参数以内联方式呈现。对此自动提供的支持有限(从SQLA 0.9开始,这将起作用):

此外,您可能希望查询是特定于MySQL的,因此,如果您已经有了一个引擎,您也可以将其传入:

from sqlalchemy import create_engine
engine = create_engine("mysql://")

print(stmt.compile(engine, compile_kwargs={"literal_binds": True}))
它会打印:

SELECT x.a, x.b 
FROM x 
WHERE x.a > 5 AND x.b = 10
现在,如果在参数中有更详细的值,比如日期,SQLAlchemy可能会抛出错误,它只有数量非常有限的类型的“文本绑定”呈现器。一种绕过该系统的方法是直接将这些参数转换为字符串,然后在语句对象上执行“搜索并替换”,用文字字符串替换绑定参数:

from sqlalchemy.sql import visitors, literal_column
from sqlalchemy.sql.expression import BindParameter

def _replace(arg):
    if isinstance(arg, BindParameter):
        return literal_column(
                repr(arg.effective_value)  # <- do any fancier conversion here
            )
stmt = visitors.replacement_traverse(stmt, {}, _replace)
或MySQL版本:

print(stmt.compile(engine))

我得到的最接近的结果是从控制台记录器中从Pyramid复制SQL查询(它没有替换“?”),但后面还包括它使用的值。然后我将它们复制/粘贴到查询的相应位置,以便运行查询。这当然是一些文本操作。
print(stmt)
print(stmt.compile(engine))