Немного фона. Это скрипт, предназначенный для сужения большого набора данных (3 + GB файлов). У меня есть серия SQL-запросов для создания временных таблиц для вставки/удаления из других таблиц.SQLite3 Python27 запрос зависает в Windows
Вот что первые несколько запросов выглядит следующим образом:
Запрос # 1
create table clash as
select *
from
StallConnected
group by Store, Stall, StartTime
having
count(*) > 1;
запрос # 2
create table OverlappingStarts as
select A.*
from
StallConnected as A
join
clash as B
on
A.Store = B.Store
and
A.Stall = B.Stall
and
A.StartTime = B.StartTime
order by
A.Store, A.Stall, A.StartTime;
Теперь на мясо вопроса. Я выполняю эти запросы последовательно, используя соединение db в модуле sqlite3 python на одном потоке. Вот код:
for i, val in enumerate(queries):
print "Step " + str(i + 1) + " of " + steps
db.executescript(val)
db.commit()
Я знаю, что executescript()
заставит COMMIT
произойти перед выполнением каждого оператора, но то, что происходит в том, что он будет выполнять первый запрос только штраф, но второй запрос будет просто висеть. Никаких исключений, ничего.
Я знаю, что это не может быть тайм-аут, поскольку это работает на одном потоке. Это тоже не исключение (очевидно, оно просто зависает). Я знаю, что это зависает, потому что файл db-journal - всего 2 КБ.
Что я пробовал:
- Совершение после каждого оператора
- закрытия/открытия соединения
- Использование
execute()
надexecutescript()
- Использование объекта курсора над прямого вызова
execute()
на соединение с базой данных
Любые мысли? Я делаю что-то по своей сути неправильно? Проблема с блокировкой файлов Windows, о которой я не знаю?
EDIT 1: После запуска сценария в течение последнего часа я обнаружил, что часть таблицы фактически заполнена. Какая сделка здесь? Запуск моего всего скрипта sql внутри DB Browser занимает всего около 30 секунд, а в python для заполнения одной части таблицы требуется более 1 часа?
Примечание стороны:
>>> sqlite3.version
'2.6.0'
>>> sqlite3.sqlite_version
'3.6.21'
>>>
Это ужасно старая версия SQLite. Вы должны обновить Python или выполнить SQL во внешней оболочке. Во всяком случае, ваша самая большая проблема - недостающие индексы. И покажите нам схему базы данных. –
Оказывается, это был простой случай устаревшего sqlite.dll – cdacamara