Объедините вставки в одну транзакцию Python SQLite3 - PullRequest
8 голосов
/ 20 февраля 2011

Я пытаюсь ввести 1000 строк на SQLite3 с помощью вставки, однако время, необходимое для вставки, слишком велико. Я слышал, что скорость значительно увеличивается, если вкладки объединяются в одну транзакцию. Однако я не могу заставить SQlite3 пропустить проверку того, что файл записан на жесткий диск.

это образец:

if repeat != 'y':
    c.execute('INSERT INTO Hand (number, word) VALUES (null, ?)', [wordin[wordnum]])
    print wordin[wordnum]

data.commit()

Это то, что у меня есть в начале.

data = connect('databasenew')
data.isolation_level = None
c = data.cursor()  
c.execute('begin')

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

Ответы [ 4 ]

3 голосов
/ 05 января 2012

Согласно документации Sqlite, BEGIN транзакция должна быть завершена с COMMIT

Транзакции могут быть начаты вручную с помощью команды BEGIN. такие транзакции обычно сохраняются до следующего COMMIT или ROLLBACK команда. Но транзакция также будет ROLLBACK, если база данных закрыт или если произошла ошибка и разрешение конфликта ROLLBACK алгоритм уточняется. Смотрите документацию по ON CONFLICT пункт для дополнительной информации о конфликте ROLLBACK алгоритм разрешения.

Итак, ваш код должен быть таким:

* * 1010
2 голосов
/ 17 апреля 2013

https://stackoverflow.com/a/3689929/1147726 отвечает на вопрос.execute ('begin') не имеет никакого эффекта.Видимо, connection.commit () достаточно.

1 голос
/ 16 сентября 2015

(Если кто-то все еще ищет ответ на этот вопрос)

Вы должны использовать executemany, если вы просто выполняете 1000 вставок подряд.

Посмотрите на Каков оптимизированный способ вставки большого количества записей (более 40 000) в sqlite3

Я только что боролся с МНОГО (порядка миллионов) исполненийэто заняло около 30 минут - переключилось на executemany, и теперь у меня есть около 10 минут.

0 голосов
/ 20 февраля 2011

Вы можете использовать executemany, см. Этот вопрос SO: вопрос Python sqlite - метод вставки

...