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

moRL

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

Пробовал объединять элементы списка, но тогда значения вносятся в одну строку таблицы.
 

moRL

Client
Регистрация
18.07.2016
Сообщения
101
Благодарностей
70
Баллы
28
Нашел такую команду 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;
 

emel

Client
Регистрация
21.02.2015
Сообщения
86
Благодарностей
18
Баллы
8
Отпишись как решил. Тоже нужно запихнуть в SQLite 15 млн. строк. Стандартными методами очень медленно получается. Или может есть какая другая база с быстрым импортом больших данных и работой с Зеннопостером. Еще есть подозрение, что SQLite сама тормознутая база. Она вроде работает в однопотоке только. С firebird вроде нормально экспорт был, 2 гига легко, про импорт не знаю, но зенка вроде с ней не работает.
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
но на 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

moRL

Client
Регистрация
18.07.2016
Сообщения
101
Благодарностей
70
Баллы
28
По умолчанию 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;
 

surrealmix

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

Пробовал объединять элементы списка, но тогда значения вносятся в одну строку таблицы.
Попробуй в строке подключения к БД добавить
Код:
;SyncPragma=OFF;JournalMode=OFF;
Отпишись о результатах скорости.
 
Последнее редактирование:

moRL

Client
Регистрация
18.07.2016
Сообщения
101
Благодарностей
70
Баллы
28

Sobesednic

Client
Регистрация
24.12.2012
Сообщения
391
Благодарностей
77
Баллы
28
попробуй sqlitestudio
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
Попробовал с BEGIN COMMIT, отсылает но разницы со стандартным запросом никакой - пихает все в одну строку.

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

emel

Client
Регистрация
21.02.2015
Сообщения
86
Благодарностей
18
Баллы
8

moRL

Client
Регистрация
18.07.2016
Сообщения
101
Благодарностей
70
Баллы
28

moRL

Client
Регистрация
18.07.2016
Сообщения
101
Благодарностей
70
Баллы
28
Пихает в одну строку - значит в обоих случаях нарушен синтаксис запросов. После формирования запроса/пакета сохраните его куда-нибудь (в переменную или файл) и проверьте вручную, где закралась ошибка.
можно подробнее? ответ от бд сохраняю в переменную, но там пусто.

sqlite.png
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
можно подробнее? ответ от бд сохраняю в переменную, но там пусто.
Имеется ввиду текст самого запроса, что вот тут находится (в виде конкретного значения):
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

moRL

Client
Регистрация
18.07.2016
Сообщения
101
Благодарностей
70
Баллы
28
Имеется ввиду текст самого запроса, что вот тут находится (в виде конкретного значения):
Посмотреть вложение 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, можно использовать.
 
Последнее редактирование:

moRL

Client
Регистрация
18.07.2016
Сообщения
101
Благодарностей
70
Баллы
28
Продолжаем пытать Sqlite)

1) Как при парсинге проверить "на лету" значения(список) на уникальность с таблицей Used из бд?
2) Как удалить дубли в таблице?
Код:
DELETE FROM users
WHERE id NOT IN (SELECT id FROM users GROUP BY user_id)
 
Последнее редактирование:

emel

Client
Регистрация
21.02.2015
Сообщения
86
Благодарностей
18
Баллы
8
В итоге 1 087 714 значений записалось буквально за секунд 10. Конечно в работе запросы будут гораздо меньше, примерно 2-3 тыс. значений за 1 проход, так что результатом полностью доволен! @emel, можно использовать.
Нормально так. Через стандартный импорт у меня два дня база импортировалась, потом мне это надоело.:-) Теперь реально можно делать проекты портабельными, надоели эти файлы, списки. Практически безграничные возможности на высокой скорости. Ещё один шаг к вершине мудрости.:-)
 

moRL

Client
Регистрация
18.07.2016
Сообщения
101
Благодарностей
70
Баллы
28
1) Как при парсинге проверить "на лету" значения(список) на уникальность с таблицей Used из бд?
Продолжаю сам решать свои запросы)

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

emel

Client
Регистрация
21.02.2015
Сообщения
86
Благодарностей
18
Баллы
8
Продолжаю сам решать свои запросы)

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

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