Python 任何使用pyodbc返回文本SQL的方法
有没有任何方法可以使用pyodbc返回传递到数据库的文本sql?我将参数传递给for循环中的语句,循环遍历字典列表。例如: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']) 我希望能够打印或存
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