如何获取发送到数据库的准备好的查询

Posted

技术标签:

【中文标题】如何获取发送到数据库的准备好的查询【英文标题】:How to get prepared query which is sent to db 【发布时间】:2013-07-11 10:52:38 【问题描述】:

当使用像pyodbc 这样实现Python Database API Specification 的数据库库时,如何在应用参数替换后获得完全准备好的查询。我正在调用一个 Sybase 存储过程,它将通过参数替换接收 18 个参数。我想捕获进行的实际调用并将其记录下来以帮助调试。我需要的一个更简单的例子:

pyodbc 示例

import pyodbc
conn = pyodbc.connect('DSN=test;PWD=password')
c = conn.cursor()
c.execute('CREATE TABLE stocks (symbol varchar(10), price real)')
c.execute("INSERT INTO stocks VALUES (?, ?)", ('RHAT', 35.14))
c.execute('SELECT * FROM stocks WHERE symbol=?', ('RHAT',))
print c.fetchone()

预期的最终查询(待记录)

CREATE TABLE stocks (symbol varchar(10), price real)
INSERT INTO stocks VALUES ('RHAT', 35.14)
SELECT * FROM stocks WHERE symbol = 'RHAT'

sqlite3 示例

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('CREATE TABLE stocks (symbol text, price real)')
c.execute("INSERT INTO stocks VALUES (?, ?)", ('RHAT', 35.14))
c.execute('SELECT * FROM stocks WHERE symbol=?', ('RHAT',))
print c.fetchone()

我放了 sqlite3 的例子,因为它不需要 pyodbc 来试用。

更新

似乎当使用prepared statements 时,将数据填充到模板中的过程是在DBMS 中的服务器端完成的。如user581592's answer中所述,经常没有方法或api可以从服务器获取最终版本的查询。其他值得注意的链接是 pyodbc 上的 Issue 163,它进一步讨论了这一点。像 psycopg 这样的一些数据库库也添加了一个方法mogrify,它将返回最终语句。但正如他们的文档中提到的,这不是 DB API 的一部分。

【问题讨论】:

【参考方案1】:

来自https://groups.google.com/forum/#!topic/pyodbc/656mRdbjFuc

pyodbc 不会以任何方式修改 SQL。一般来说,“好”的 ODBC 驱动程序也不行。

由于它不是一个受支持的函数,因此没有用于检索最终 SQL 的 ODBC 函数,因此 pyodbc 无法提供此功能。

因此,最好的办法是在脚本中分别记录查询和参数,或者如果可行,您可以尝试在数据库上配置某种级别的查询记录。

【讨论】:

以上是关于如何获取发送到数据库的准备好的查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用索引号将数据发送到mysqli(准备好的语句)

如何获取发送到以太坊地址的总金额

如何在for循环中执行准备好的语句以从jsp中的表中获取数据?

如何将参数绑定到未准备好的查询?

如何查看准备好的语句的内容?

如何在控制器中获取视图然后渲染数据并将其传递给 ajax