【问题标题】:pyodbc fast_executemany with Access ODBC crashes Python interpreter带有 Access ODBC 的 pyodbc fast_executemany 使 Python 解释器崩溃
【发布时间】:2018-04-24 13:28:20
【问题描述】:

我正在尝试在 MS Access 数据库中生成和插入许多 (>1.000.000) 行。对于这一代,我使用 numpy 函数,因此我尝试使用 python 访问数据库。我从pyodbc开始:

import numpy as np
import pyodbc as db
connection_string = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/Users.../DataCreation.accdb;"
connection = db.connect(connection_string)
cur = connection.cursor()

k = 0
numberofdatasets=1000

for l in range(50):
    params=np.empty(numberofdatasets, dtype=[('valnr', int),('val', float)])

    for j in range(numberofdatasets):
        params[j]= (k, somevalue generated with a numpy function)      
        k=k+1

    params = np.array(params).tolist()
    cur.executemany("INSERT INTO DataFinal VALUES (1,?,1,?);", params)

    connection.commit()

connection.close()

这可行,但对我有用的时间太长了。我计时了,问题是

cur.executemany

我搜索了互联网并找到了 fast_executemany 标志。但是当我添加行时

cur.fast_executemany = True

我的内核死了。有谁知道为什么?我正在使用 64 位 Windows 10、Python 3.6、Spyder 3.2.8 和 MS Access 2016。请不要建议不使用 MS Access,我知道有更高效的数据库可以做到这一点,但现在这就是我的全部可以使用。我也知道,首先生成 numpy 数组然后将其转换为列表可能不是最好的。我的下一个尝试是 turbodbc 及其功能

 cursor.executemanycolumns

但这引发了驱动程序错误,因此我认为这是一个不同的问题。感谢您提供任何帮助,但也许我应该补充一点,我刚刚开始将 Python 与数据库结合使用,我更愿意至少了解一下这个问题,而不仅仅是复制一些神秘代码:) 谢谢。

【问题讨论】:

  • 当您说“我的内核死机”时,您的意思是您从 Windows 获得了 BSOD 吗?还是别的什么?
  • 这行得通,但对我有用的时间太长了。 ...这是多长时间? 5 分钟? 5个小时?您需要多久插入 100 万条记录?请注意:MS Access 有一个2GB size limit。它确实可以覆盖超过 100 万,但是如果您的表格很宽,只有少数文本列,那么字节加起来!
  • @user1443098 - 不是 BSOD,而是 python.exe 中的 APPCRASH。 (至少我是这样的。)

标签: python ms-access pyodbc


【解决方案1】:

pyodbc fast_executemany 功能使用称为“参数数组”的 ODBC 机制。并非所有 ODBC 驱动程序都支持参数数组,显然 Microsoft Access ODBC 驱动程序不支持。如pyodbc Wiki中所述

请注意,此功能...目前仅推荐用于在 Windows 上运行且使用 Microsoft 的 ODBC Driver for SQL Server 的应用程序。

【讨论】:

  • 我有写出两个 Access 表的 Python 代码。两者都使用'executemany',都设置fast_executemany = True。一个有效,另一个使内核崩溃。两个表都混合了长整数、双精度和短文本字段。一种有效的是输出 1000 行,而使内核崩溃的一种尝试输出 16 行。所以我相信真正的答案更深刻(也更神秘)。
猜你喜欢
  • 2012-07-11
  • 1970-01-01
  • 2019-07-30
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多