3

有没有办法使用 pyodbc 返回传递给数据库的文字 sql?我将参数传递给迭代字典列表的 for 循环中的语句。例如:

mylist = [{'name': 'john', 'key': 1}, {'name': 'jane', 'key': 2}]
sql = "update people set name = ? where key = ?"
for i in mylist:
    cursor.execute(sql, i['name'], i['key']) 

我希望能够打印或存储脚本传递给数据库的文字 sql。如果使用 pyodbc 无法做到这一点,有人可以推荐一个具有此功能的不同 Python 模块吗?提前致谢。

4

2 回答 2

3

它不是内置的,但实现起来相当简单。

与其他解决方案类似。但写一个通用方法,如:

def executeAndLog( db_cursor, sql, *args ) :
    run_sql = sql.replace( '?', '{!r}' ).format( *args )
    try:
        db_cursor.execute( sql, *args )
        logging.info( run_sql )
    except Exception as e:
        logging.error( " ".join( run_sql, "failed with error", e ) )

您可能希望向调用者指示它是否成功,因此要么返回某些内容,要么重新引发异常。

于 2016-10-28T08:41:47.433 回答
0

您可以使用内置的日志记录模块:

import logging
import pyodbc

# setup logging level and file name
logging.basicConfig(filename='sql.log', level=logging.DEBUG)

# connection = pyodbc....
# cursor = connection...

# define parameter values and sql 
mylist = [{'name': 'john', 'key': 1}, {'name': 'jane', 'key': 2}]
sql = "update people set name = ? where key = ?"

for i in mylist:
    cursor.execute(sql, i['name'], i['key'])
    # {!r} ensures string values wrapped with single quote
    logging.debug(sql.replace('?', '{!r}').format(i['name'], i['key']))

您可能希望添加一些异常处理cursor.execute以仅在调用成功时记录。

于 2013-10-02T15:48:50.467 回答