由于将有缺陷的sql查询直接粘贴到数据库管理工具(如phpmyadmin)中以便在它返回预期结果之前对其进行处理可能是有效的, 是否有任何方法可以检索最终的sql语句Sqlalchemy Core据说传递给MySql数据库,处于准备执行的形状?
答案 0 :(得分:1)
这通常意味着您希望绑定参数以内联方式呈现。对此有有限的支持(从SQLA 0.9起,这将起作用):
from sqlalchemy.sql import table, column, select
t = table('x', column('a'), column('b'))
stmt = select([t.c.a, t.c.b]).where(t.c.a > 5).where(t.c.b == 10)
print(stmt.compile(compile_kwargs={"literal_binds": True}))
你也可能希望查询是特定于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)
一旦你这样做,你就可以打印出来:
print(stmt)
或MySQL版本:
print(stmt.compile(engine))