【问题标题】:Pyodbc executemany only returns last element insertedPyodbc executemany 只返回最后插入的元素
【发布时间】:2020-10-30 13:21:06
【问题描述】:

使用以下函数:

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)

Result 只返回 params 中最后一个条目的 idsha。一切都正确插入到数据库中。非常欢迎任何关于为什么只有最后一个插入给出输出的见解。

【问题讨论】:

标签: python database insert pyodbc


【解决方案1】:

原因是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多