如何解决Pyodbc executemany仅返回最后插入的元素
使用以下功能:
import pyodbc
def execute_side_effect_stmt(sql_stmt: str,params: list):
with get_connection() as conn:
cursor = conn.cursor()
cursor.executemany(sql_stmt,params)
columns = [column[0] for column in cursor.description]
results = cursor.fetchall()
response = []
for row in results:
response.append(dict(zip(columns,row)))
conn.commit()
if not response:
return ''
return response
具有以下参数:
sql = """INSERT INTO dbo.events
(sha,duration)
OUTPUT Inserted.id,Inserted.sha
VALUES (?,?)"""
params = [('123',1),('456',2),('789',3)]
result = execute_side_effect_stmt(sql,params)
结果仅以参数形式返回最后一个条目的 id 和 sha 。一切都正确地插入到数据库中。对于为什么只有最后一个插入片段会给出输出的任何见解都将受到欢迎。
解决方法
原因是cursor.executemany()
为params
中的每个元素执行SQL语句。
如docs所示,除非您设置cursor.fast_executemany = True
,否则INSERT
语句将被调用len(params)
次。
对于cursor.fast_executemany = True
,结果将是here中所述的单个插入
如上所述:
在这里,所有参数都与捆绑在一起(连同SQL语句)一起发送到数据库服务器,并且数据库将所有参数作为一个数据库事务执行SQL。因此,这种形式的
executemany()
应该比默认的executemany()
快得多。但是,它有局限性,有关更多详细信息,请参见fast_executemany
。
您的代码可以修改为:
import pyodbc
def execute_side_effect_stmt(sql_stmt: str,params: list):
with get_connection() as conn:
cursor = conn.cursor()
cursor.fast_executemany = True
cursor.executemany(sql_stmt,params)
columns = [column[0] for column in cursor.description]
results = cursor.fetchall()
response = []
for row in results:
response.append(dict(zip(columns,row)))
conn.commit()
if not response:
return ''
return response
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。