gpt4 book ai didi

python - 如何获得发送到数据库的准备好的查询

转载 作者:太空狗 更新时间:2023-10-30 00:03:15 26 4
gpt4 key购买 nike

当使用像 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 的回答中所述,经常没有方法或 api 从服务器获取查询的最终版本。其他需要注意的链接是 Issue 163在 pyodbc 上进一步讨论了这个问题。此外,一些数据库库(如 psycopg)添加了一个方法 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.

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

关于python - 如何获得发送到数据库的准备好的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17591459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com