我正在尝试记录从脚本执行的每个SQL语句。但是,我考虑了一个我无法克服的问题。

是否有一种方法可以在指定绑定变量后计算实际的SQL语句。在sqlite中,我必须使用以下代码计算要手动执行的语句:

def __sql_to_str__(self, value,args):
    for p in args:
        if type(p) is IntType or p is None:
            value = value.replace("?", str(p) ,1)
        else:
            value = value.replace("?",'\'' + p + '\'',1)
    return value

看来cx_oracle有 cursor.parse() 设施。但是我不知道如何欺骗cx_oracle在执行之前计算查询。

有帮助吗?

解决方案

查询是 绝不 计算为一个字符串。查询和参数的实际文本是 绝不 插值和 两者都产生一个真正的完整字符串。

这就是使用参数化查询的全部要点 - 您将查询与数据分开 - 防止SQL注射和限制一次,并允许简单的查询优化。数据库既可以单独进行,并且可以做需要做的事情,而无需将它们加入。

也就是说,您可以自己生成查询,但是请注意,您生成的查询(尽管可能等效)并不是数据库中实际执行的问题。

其他提示

最好的选择是在数据库服务器上进行操作,因为正确实现的Oracle连接器不会在将查询发送到服务器之前将绑定变量放入字符串中。查看是否可以找到使其记录其执行的查询的Oracle服务器设置。

您可能需要考虑为此使用Oracle的扩展SQL跟踪功能。我建议从这里开始: http://carymillsap.blogspot.com/2011/01/new-paper-mastering-performance-with.html.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top