pyodbc:使用带有 TEXT / NTEXT 列的 fast_executemany 的内存错误

Hen*_*ang 4 sql-server pyodbc python-3.x

我在将行插入数据库时​​遇到问题。只是想知道是否有人知道为什么会发生这种情况?当我避免使用 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:

Run Code Online (Sandbox Code Playgroud)

Gor*_*son 8

fast_executemany使用TEXTNTEXT列时存在一个已知问题,如 GitHub此处所述

问题在于,当 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 不推荐使用的列类型,因此不太可能正式修复此问题。)