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)
fast_executemany使用TEXT或NTEXT列时存在一个已知问题,如 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 不推荐使用的列类型,因此不太可能正式修复此问题。)
| 归档时间: |
|
| 查看次数: |
2790 次 |
| 最近记录: |