Записать список в SQLite

  • Автор темы Автор темы moRL
  • Дата начала Дата начала
  • Теги Теги
    sqlite

moRL

Client
Регистрация
18.07.2016
Сообщения
101
Реакции
71
Баллы
28
Помогите решить головоломку: есть список спаршенных данных в списке и нужно внести эти данные в таблицу SQLite. Сейчас беру стандартным экшеном - получаю строку списка и добавляю в БД, но на 400 строк уходит 1,5-2 минуты.

Пробовал объединять элементы списка, но тогда значения вносятся в одну строку таблицы.
 
Нашел такую команду LOAD DATA LOCAL INFILE, попробовал и лезет ошибка DB ERROR {HY000] near "LOAD" syntax error (1) и сбойное действие Insert to db

Пробовал так
Код:
Развернуть Свернуть Копировать
LOAD DATA LOCAL INFILE '{-Project.Directory-}\Data\temp.txt' INTO TABLE Users;
 
Отпишись как решил. Тоже нужно запихнуть в SQLite 15 млн. строк. Стандартными методами очень медленно получается. Или может есть какая другая база с быстрым импортом больших данных и работой с Зеннопостером. Еще есть подозрение, что SQLite сама тормознутая база. Она вроде работает в однопотоке только. С firebird вроде нормально экспорт был, 2 гига легко, про импорт не знаю, но зенка вроде с ней не работает.
 
но на 400 строк уходит 1,5-2 минуты
По умолчанию SQLite на каждый запрос закрывает и открывает файл БД, на что и тратится больше всего времени. Решить проблему просто - отправлять данные одним запросом вида:
Код:
Развернуть Свернуть Копировать
INSERT INTO table (column1, column2) VALUES (data1, data2), (data1, data2), (data1, data2), (data1, data2);
Либо отправлять все запросы пачкой, с помощью BEGIN и COMMIT. Для этого собираем все запросы в одну строковую переменную, в самом начале ставим BEGIN;, в самом конце - COMMIT;.
Если таблица не слишком большая, отправка таким способом 400 запросов должна занять не больше секунды.

Еще есть подозрение, что SQLite сама тормознутая база. Она вроде работает в однопотоке только.
Рекомендую почитать что-нибудь о SQLite, на хабре например неплохие статьи были.
 
  • Оценить
Реакции: emel
По умолчанию SQLite на каждый запрос закрывает и открывает файл БД, на что и тратится больше всего времени. Решить проблему просто - отправлять данные одним запросом вида:
Код:
Развернуть Свернуть Копировать
INSERT INTO table (column1, column2) VALUES (data1, data2), (data1, data2), (data1, data2), (data1, data2);
Либо отправлять все запросы пачкой, с помощью BEGIN и COMMIT. Для этого собираем все запросы в одну строковую переменную, в самом начале ставим BEGIN;, в самом конце - COMMIT;
Попробовал с BEGIN COMMIT, отсылает но разницы со стандартным запросом никакой - пихает все в одну строку.

Объединял список в переменную с разными разделителями - и ',' и ', ' и ';' и ':' пробовал, все равно в базу пишется одна строка со всеми значениями. Пихал таким запросом.
Код:
Развернуть Свернуть Копировать
BEGIN;
INSERT INTO Users (user_id) VALUES ('{-Variable.user_id-}');
COMMIT;
 
Помогите решить головоломку: есть список спаршенных данных в списке и нужно внести эти данные в таблицу SQLite. Сейчас беру стандартным экшеном - получаю строку списка и добавляю в БД, но на 400 строк уходит 1,5-2 минуты.

Пробовал объединять элементы списка, но тогда значения вносятся в одну строку таблицы.
Попробуй в строке подключения к БД добавить
Код:
Развернуть Свернуть Копировать
;SyncPragma=OFF;JournalMode=OFF;
Отпишись о результатах скорости.
 
Последнее редактирование:
Попробуй в строке подключения к БД добавить
Код:
Развернуть Свернуть Копировать
;SyncPragma=OFF;JournalMode=OFF;
Отпишись о результатах скорости.
Тоже самое ~250 строк в минуту. Все еще ищу решение...
 
попробуй sqlitestudio
 
Попробовал с BEGIN COMMIT, отсылает но разницы со стандартным запросом никакой - пихает все в одну строку.

Объединял список в переменную с разными разделителями - и ',' и ', ' и ';' и ':' пробовал, все равно в базу пишется одна строка со всеми значениями. Пихал таким запросом.
Пихает в одну строку - значит в обоих случаях нарушен синтаксис запросов. После формирования запроса/пакета сохраните его куда-нибудь (в переменную или файл) и проверьте вручную, где закралась ошибка.
 
Пихает в одну строку - значит в обоих случаях нарушен синтаксис запросов. После формирования запроса/пакета сохраните его куда-нибудь (в переменную или файл) и проверьте вручную, где закралась ошибка.
можно подробнее? ответ от бд сохраняю в переменную, но там пусто.

sqlite.png
 
можно подробнее? ответ от бд сохраняю в переменную, но там пусто.
Имеется ввиду текст самого запроса, что вот тут находится (в виде конкретного значения):
2017-08-09_16-32-46.png

Для работы в кубике, лучше все 400 запросов или 1 скленный сформировать заранее в какую-нибудь переменную, и эту переменную вставить в поле на скрине выше. Заодно и проверить текст запроса внутри неё будет проще на правильность.
Как примерно должен выглядеть текст запроса, если использовать пакетную отправку:
Код:
Развернуть Свернуть Копировать
BEGIN;
INSERT INTO table (column1, column2) VALUES (data001, data002);
INSERT INTO table (column1, column2) VALUES (data003, data004);
//Тут ещё ~400 запросов
INSERT INTO table (column1, column2) VALUES (data797, data798);
INSERT INTO table (column1, column2) VALUES (data799, data800);
COMMIT;
Аналогично, если склеить все данные в 1 запрос:
Код:
Развернуть Свернуть Копировать
INSERT INTO table (column1, column2) VALUES (data001, data002), (data003, data004), /* тут ещё ~400 наборов данных, каждый набор в своих скобках */, (data797, data798), (data799, data800);
 
  • Оценить
Реакции: surrealmix, emel и moRL
Имеется ввиду текст самого запроса, что вот тут находится (в виде конкретного значения):
Посмотреть вложение 22679

Для работы в кубике, лучше все 400 запросов или 1 скленный сформировать заранее в какую-нибудь переменную, и эту переменную вставить в поле на скрине выше. Заодно и проверить текст запроса внутри неё будет проще на правильность.
Как примерно должен выглядеть текст запроса, если использовать пакетную отправку:
Код:
Развернуть Свернуть Копировать
BEGIN;
INSERT INTO table (column1, column2) VALUES (data001, data002);
INSERT INTO table (column1, column2) VALUES (data003, data004);
//Тут ещё ~400 запросов
INSERT INTO table (column1, column2) VALUES (data797, data798);
INSERT INTO table (column1, column2) VALUES (data799, data800);
COMMIT;

@LaGir Спасибо огромное! Вообщем все заработало, пришлось немного пошаманить)

1. Объединяем элементы списка в переменную, например, ID с разделителем
Код:
Развернуть Свернуть Копировать
'); {-String.Enter-}INSERT INTO Имя_таблицы (id) VALUES ('
1.png
2. Меняем значение переменной ID и сохраняем в переменную insert_to_database(можно сохранять в ту же ID)
Код:
Развернуть Свернуть Копировать
INSERT INTO Имя_таблицы (id) VALUES ('{-Variable.id-}');
2.png
3. Передаем запрос в БД
Код:
Развернуть Свернуть Копировать
BEGIN;
{-Variable.insert_to_database-}
COMMIT;

В итоге 1 087 714 значений записалось буквально за секунд 10. Конечно в работе запросы будут гораздо меньше, примерно 2-3 тыс. значений за 1 проход, так что результатом полностью доволен! @emel, можно использовать.
 
Последнее редактирование:
Продолжаем пытать Sqlite)

1) Как при парсинге проверить "на лету" значения(список) на уникальность с таблицей Used из бд?
2) Как удалить дубли в таблице?
Код:
Развернуть Свернуть Копировать
DELETE FROM users
WHERE id NOT IN (SELECT id FROM users GROUP BY user_id)
 
Последнее редактирование:
В итоге 1 087 714 значений записалось буквально за секунд 10. Конечно в работе запросы будут гораздо меньше, примерно 2-3 тыс. значений за 1 проход, так что результатом полностью доволен! @emel, можно использовать.
Нормально так. Через стандартный импорт у меня два дня база импортировалась, потом мне это надоело.:-) Теперь реально можно делать проекты портабельными, надоели эти файлы, списки. Практически безграничные возможности на высокой скорости. Ещё один шаг к вершине мудрости.:-)
 
1) Как при парсинге проверить "на лету" значения(список) на уникальность с таблицей Used из бд?
Продолжаю сам решать свои запросы)

Решил так:
1. Пересоздал столбец с галочкой уникальность и при конфликте выбрано IGNORE.
2. Передаю в запросе новые строки со статусом 0 - запишутся только уникальные значения, дублирующиеся не будут записаны из-за настроек в п.1
3. Забираю значения с 0 и меняю им статус на 1.
 
Продолжаю сам решать свои запросы)

Решил так:
1. Пересоздал столбец с галочкой уникальность и при конфликте выбрано IGNORE.
2. Передаю в запросе новые строки со статусом 0 - запишутся только уникальные значения, дублирующиеся не будут записаны из-за настроек в п.1
3. Забираю значения с 0 и меняю им статус на 1.

Это уже тонкости. Вот у этого товарища есть хорошее видео о том, как работать с БД. Где то в постах выкладывал. Там такие моменты довольно хорошо освещены.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)