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