首页 > 解决方案 > pyodbc:使用带有 TEXT / NTEXT 列的 fast_executemany 的内存错误

问题描述

我在将行插入数据库时​​遇到问题。只是想知道是否有人知道为什么会这样?当我避免使用 fast_executemany 但插入变得非常慢时,它可以工作。

driver = 'ODBC Driver 17 for SQL Server'
conn = pyodbc.connect('DRIVER=' + driver + ';SERVER=' + server+ \
                      ';UID=' + user+ ';PWD=' + password)
cursor = conn.cursor()
cursor.fast_executemany = True

insert_sql = """
INSERT INTO table (a, b, c)
VALUES (?, ?, ?)
"""

cursor.executemany(insert_sql, insert_params)

---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-12-e7e82e4d8c2d> in <module>
      2 start_time = time.time()
      3 
----> 4 cursor.executemany(insert_sql, insert_params)

MemoryError:

标签: sql-serverpython-3.xpyodbc

解决方案


使用或列fast_executemany时存在一个已知问题如 GitHub 上所述。TEXTNTEXT

问题在于,当 pyodbc 查询数据库元数据以确定列的最大大小时,驱动程序返回 2 GB(而不是 0,就像为[n]varchar(max)列返回的那样)。

pyodbc 为参数数组中的每个[N]TEXT元素分配 2 GB 的内存,Python 应用程序很快就会耗尽内存。

解决方法是使用cursor.setinputsizes([(pyodbc.SQL_WVARCHAR, 0, 0)])(如此所述)诱使 pyodbc 将[N]TEXT列视为[n]varchar(max)列。

(鉴于这[N]TEXT是 SQL Server 不推荐使用的列类型,因此不太可能对此问题进行正式修复。)


推荐阅读