Python sqlite3 "не удается открыть файл базы данных" на окнах - PullRequest
6 голосов
/ 07 октября 2009

Я работаю на машине Windows Vista в Python 3.1.1. Я пытаюсь вставить большое количество строк в базу данных SQLite3. Файл существует, и моя программа правильно вставляет некоторые строки в базу данных. Однако в какой-то момент процесса вставки программа умирает с этим сообщением: sqlite3.OperationalError: невозможно открыть файл базы данных

Однако, прежде чем он умрет, есть несколько строк, которые правильно добавлены в базу данных.

Вот код, который специально обрабатывает вставку:

idx = 0
lst_to_ins = []
for addl_img in all_jpegs:
    lst_to_ins.append((addl_img['col1'], addl_img['col2']))
    idx = idx + 1
    if idx % 10 == 0:
        logging.debug('adding rows [%s]', lst_to_ins)
        conn.executemany(ins_sql, lst_to_ins)
        conn.commit()
        lst_to_ins = []
        logging.debug('added 10 rows [%d]', idx)
if len(lst_to_ins) > 0:
    conn.executemany(ins_sql, lst_to_ins)
    conn.commit()
    logging.debug('adding the last few rows to the db')

Этот код вставляет от 10 до 400 строк, а затем умирает с сообщением об ошибке

conn.executemany(ins_sql, lst_to_ins)
sqlite3.OperationalError: unable to open database file

Как это возможно, что я могу вставить несколько строк, но затем получить эту ошибку?

Ответы [ 2 ]

1 голос
/ 07 октября 2009

SQLite не имеет блокировки записи; он использует простой механизм блокировки, который на короткое время блокирует весь файл базы данных во время записи. Звучит так, будто вы наткнулись на замок, который еще не очищен.

Автор SQLite рекомендует создать транзакцию до выполнения вставки, а затем завершить транзакцию в конце. Это заставляет SQLite ставить в очередь запросы на вставку и выполнять их, используя одну блокировку файла, когда транзакция фиксируется.

В новейшей версии SQLite механизм блокировки был усовершенствован, поэтому он может больше не требовать полной блокировки файлов.

0 голосов
/ 24 января 2010

та же ошибка здесь, в Windows 7 (python 2.6, django 1.1.1 и sqllite) после того, как некоторые записи вставлены правильно: sqlite3.OperationalError: невозможно открыть файл базы данных

Я запускал свой скрипт из Eclipse разное и всегда получал эту ошибку. Но когда я запустил его из командной строки (после установки PYTHONPATH и DJANGO_SETTINGS_MODULE), это сработало как чудо ...

только мои 2 цента!

...