pyodbc fast_executemany с Access ODBC аварийно завершает работу интерпретатора Python - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь сгенерировать и вставить много (> 1.000.000) строк в базу данных MS Access.Для генерации я использую функции 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 для работы с базами данных, и я предпочитаю хотя бы немного понять проблему, а не просто копировать какой-то загадочный код :) Спасибо.

1 Ответ

0 голосов
/ 24 апреля 2018

Функция pyodbc fast_executemany использует механизм ODBC, называемый "массивами параметров".Не все драйверы ODBC поддерживают массивы параметров, и, по-видимому, драйвер ODBC от Microsoft Access этого не делает.Как упоминалось в pyodbc Wiki

Обратите внимание, что эта функция ... в настоящее время рекомендуется только для приложений, работающих в Windows, использующих драйвер ODBC от Microsoft для SQL Server.

...