加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何获取发送到db的准备好的查询

发布时间:2020-12-16 21:48:41 所属栏目:Python 来源:网络整理
导读:当使用像pyodbc这样实现Python Database API Specification的数据库时,如何在应用参数替换后获得完全准备好的查询.我正在调用一个Sybase存储过程,它将通过参数替换接收18个参数.我想捕获所做的实际调用并将其记录以帮助调试.我需要的一个更简单的例子: pyod

当使用像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=?',))
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,))
print c.fetchone()

我已经把sqlite3放在了示例中,因为它不需要pyodbc来试用它.

UPDATE

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

最佳答案
从https://groups.google.com/forum/#!topic/pyodbc/656mRdbjFuc起

pyodbc does not modify the SQL in any way. In general,“good” ODBC drivers don’t either.

Since it is not a supported function,there is no ODBC function for retrieving the final SQL,so there is no way pyodbc could offer this.

因此,您最好的选择可能是在脚本中单独记录查询和参数,或者如果可行,您可以尝试在数据库上配置某种级别的查询日志记录.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读