Python 任何使用pyodbc返回文本SQL的方法

Python 任何使用pyodbc返回文本SQL的方法,python,sql-server,python-2.7,pyodbc,Python,Sql Server,Python 2.7,Pyodbc,有没有任何方法可以使用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']) 我希望能够打印或存

有没有任何方法可以使用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模块?提前谢谢

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

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']))

您可能需要在
游标周围添加一些异常处理。执行
仅在调用成功时记录。它不是内置的,但实现起来相当简单

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

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 ) )

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

AFAIK没有“文字SQL”。这就是准备好的语句的要点——节省了大量(昂贵的)字符串处理和(反)两端转义。也许我使用了错误的术语。对于上面的代码,我希望在第一次迭代中使用字符串“updatepeoplessetname='john',其中key='1'”。这样我就可以记录脚本执行的所有sql语句。@JamesNicholson,但这不是发送到数据库的内容。更好的“解决方案”是使用*args