Python Pyodbc executemany仅返回插入的最后一个元素

Python Pyodbc executemany仅返回插入的最后一个元素,python,database,insert,pyodbc,Python,Database,Insert,Pyodbc,使用以下功能: 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.descrip

使用以下功能:

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)

结果仅返回参数中最后一项的idsha。所有内容都已正确插入数据库。任何关于为什么只有最后一次插入才给出输出的见解都是非常受欢迎的。

原因是
cursor.executemany()
params
中的每个元素执行SQL语句。 如中所示,除非设置
cursor.fast\u executemany=True
,否则
INSERT
语句将被调用
len(params)

使用
cursor.fast\u executemany=True
,结果将是如上所述的单个插入

如上所述:

在这里,所有参数都在一个包中发送到数据库服务器(与SQL语句一起),数据库将针对所有参数作为一个数据库事务执行SQL。因此,这种形式的
executemany()
应该比默认的
executemany()
快得多。但是,它有一些限制,请参阅以了解更多详细信息

您的代码可以修改为:

导入pyodbc
def execute_side_effect_stmt(sql stmt:str,params:list):
使用get_connection()作为连接:
游标=连接游标()
cursor.fast\u executemany=True
cursor.executemany(sql语句,参数)
columns=[column[0]表示游标中的列。说明]
结果=cursor.fetchall()
响应=[]
对于结果中的行:
append(dict(zip(列,行)))
康涅狄格州提交
如果没有答复:
返回“”
返回响应
相关: