检索最终的sql查询语句(使用值代替任何'?')

时间:2014-02-12 18:02:38

标签: sqlalchemy pyramid

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

1 个答案:

答案 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))