phi*_*ext 45 python sql ms-access pyodbc
我在Python中使用以下代码(pyodbc用于MS-Access基础).
cursor.execute("select a from tbl where b=? and c=?", (x, y))
Run Code Online (Sandbox Code Playgroud)
没关系,但是出于维护目的,我需要知道发送到数据库的完整而准确的SQL字符串.
有可能吗?怎么样?
sam*_*ias 44
它因司机而异.这是两个例子:
import MySQLdb
mc = MySQLdb.connect()
r = mc.cursor()
r.execute('select %s, %s', ("foo", 2))
r._executed
"select 'foo', 2"
import psycopg2
pc = psycopg2.connect()
r = pc.cursor()
r.execute('select %s, %s', ('foo', 2))
r.query
"select E'foo', 2"
Run Code Online (Sandbox Code Playgroud)
答案是不.我在项目'home Google Code(以及Google Group)中发布我的问题的答案是:
在问题163上的评论#1由l ... @ deller.id.au:cursor.mogrify返回查询字符串 http://code.google.com/p/pyodbc/issues/detail?id=163
这里有一个链接到他们所指的"mogrify"游标方法的pyscopg文档:http: //initd.org/psycopg/docs/cursor.html#cursor.mogrify
pyodbc不执行SQL的任何此类转换:它将参数化SQL直接传递给ODBC驱动程序.唯一涉及的处理是将参数从Python对象转换为ODBC API支持的C类型.
在将ODBC发送到服务器之前,可以在ODBC驱动程序中执行某些转换(例如Microsoft SQL Native Client执行此操作),但这些转换在pyodbc中是隐藏的.
因此,我认为在pyodbc中提供mogrify函数是不可行的.
为了调试目的,我创建了一个检查函数,它只是替换 ? 与查询值...这不是高科技:)但它有效!:D
def check_sql_string(sql, values):
unique = "%PARAMETER%"
sql = sql.replace("?", unique)
for v in values: sql = sql.replace(unique, repr(v), 1)
return sql
query="""SELECT * FROM dbo.MA_ItemsMonthlyBalances
WHERE Item = ? AND Storage = ? AND FiscalYear = ? AND BalanceYear = ? AND Balance = ? AND BalanceMonth = ?"""
values = (1,2,"asdasd",12331, "aas)",1)
print(check_sql_string(query,values))
Run Code Online (Sandbox Code Playgroud)
结果:
SELECT * FROM dbo.MA_ItemsMonthlyBalances WHERE Item = 1 AND Storage = 2 AND FiscalYear = 'asdasd' AND BalanceYear = 12331 AND Balance = 'aas') AND BalanceMonth = 1
有了这个,你可以记录或做任何你想做的事:
rowcount = self.cur.execute(query,values).rowcount
logger.info(check_sql_string(query,values))
Run Code Online (Sandbox Code Playgroud)
如果您需要,只需向函数添加一些异常捕获即可。
| 归档时间: |
|
| 查看次数: |
63323 次 |
| 最近记录: |