Форум сайта python.su
Добрый вечер. Можно ли создавать транзакции внутри цикла?
Просто почему то в первый раз быстро выполнилось а дальше медленно выполняется.
Понятно что одно соединение к базе значит одна транзакция.
Но я хочу открывать транзакцию скажем в цикле и там же закрывать,а это значит сколько угодно можно транзакций создавать в одном соединении к базе.
То есть складываем инсерты после обычного запроса select.
и потом условие если собрали в счетчике 10к инсертов:
то открываем транзакцию и выполняем все инсерты, коммитим и потом снова складываем 10к инсертов и снова входим в цикл для создания транзакции и выполнения.
#несколько раз выполняем транзакцию.В первый раз отработало в 2-3сек а второй в 1мин #странно.Количество инсертов одинаковое ведь. #до транзакции еще обычный запрос q2 = QtSql.QSqlQuery( SOED2 ) q2.exec("select бла бла бла ") ... if (len(sp) != 0 and i==10000) or (len(sp) != 0 and q1.isValid() == False): SOED2.transaction() q2 = QtSql.QSqlQuery( SOED2 ) q2.exec("PRAGMA synchronous = OFF") q2.exec("PRAGMA journal_mode = OFF") for w in range(0,len(sp)): q2.exec(sp[w]) continue SOED2.commit() i = 0
Отредактировано Ser5+ (Март 29, 2021 16:56:55)
Офлайн
Или может какой-то конфликт происходит? Обычный запрос без транзакции к текущей базе относится и потом создаю транзакцию для этого же соединения к этой же базе. Как правильно выполнять запросы,чтобы можно было в перемешку выполнять запросы?
Офлайн
Скорее всего проблема была не в транзакции. А именно выборка после записи,так как данных становится больше после записи и базе sqlite нужно как то заново отсортировать прежде чем читать и отсюда медлительность походу. Думаю как можно обновить табличку после записи.
Офлайн
> Понятно что одно соединение к базе значит одна транзакция.
Нет, соединение никак не связаны с транзакциями.
Офлайн
Вопрос решен. Тему можно закрыть. Был неправильно создан индекс,точнее дополнительный создал индекс и все пошло как по маслу.
Офлайн
Хорошее решение )
Офлайн