Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / SQLite Новый топик    Ответить
 Импорт файла в базу данных через sqlite3  [new]
BlackeAngel
Member

Откуда:
Сообщений: 548
Всем привет. Нужно загрузить текстовый файл в базу данных кол-во строк 4млн, вес файла 58 мб.
Написал вот такой код
db_file="./user_dict.db"
dict_lang="ru"
dict_file="./russian2.txt"
tmp_file="./tmp.csv"
temp_txt="./tmp.txt"
#экспорт из словаря в файл вместе со столбцами
#sqlite3 -header -csv $db_file "select * from words;" > /sdcard/out.csv
#экспорт из словаря в файл только слов
echo "Получаем данные из словаря..."
sqlite3 -csv $db_file "select [word] from words;" > $tmp_file
#удаляем кавычки 
sed -i "s/\"//g" $tmp_file
#очищаем таблицу
sqlite3 $db_file "delete from words;"
#соединяем файлы в один
echo "Объединяем словари..."
cat $dict_file >> $tmp_file
#сортируем и удаляем дубли
cat $tmp_file | sort -u > $temp_txt
rm -rf $tmp_file
#записываем в базу
echo "Заполняем таблицу базы данных, ожидайте..."
i=1
cat $temp_txt | while read a
do
    sqlite3 $db_file "INSERT INTO words (_id,word,frequency,locale,appid,shortcut) VALUES ('$i','$a','1','$dict_lang','0','');"
    let "i=i+1"
done
rm -rf $temp_txt
echo "Готово!"

За 7 часов работы этого скрипта было импортировано. 1,205 млн записей.
Как ускорить это мероприятие?
14 дек 18, 20:59    [21764441]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
Dima T
Member

Откуда:
Сообщений: 14031
BlackeAngel
Как ускорить это мероприятие?

Глянь сюда https://www.sql.ru/forum/1302777/baza-3-mln-shtrihkodov
3 млн. за несколько секунд.
14 дек 18, 21:11    [21764450]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
White Owl
Member

Откуда:
Сообщений: 12405
BlackeAngel
За 7 часов работы этого скрипта было импортировано. 1,205 млн записей.
Как ускорить это мероприятие?

sqlite3 dbfile ".import <TextFile> <Table>"
14 дек 18, 21:53    [21764477]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
BlackeAngel
Member

Откуда:
Сообщений: 548
White Owl,
А в определенный столбец разве так можно вставлять?
14 дек 18, 22:10    [21764496]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
BlackeAngel
Member

Откуда:
Сообщений: 548
White Owl,

Почему тогда это
sqlite3 $db_file ".mode csv .import $temp_txt words"

Не работает? Просто моргает, а ничего не вставляет?
Я делаю просто: достаю данные в файл csv из таблицы в бд, чищу таблицу и пытаюсь экспортированные данные из csv засунуть обратно - ничего не происходит.
14 дек 18, 23:06    [21764519]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
BlackeAngel
Member

Откуда:
Сообщений: 548
White Owl,
А если делать так:
Экспортирую в csv через
sqlite3 -csv $db_file "select * from words;" > $tmp_file

А затем не трогая его очищаю таблицу, и импортирую файл csv который только что эксортировал вот так
sqlite3 $db_file ".import $tmp_file words"

То ругается ошибками
./tmp.csv:25191: INSERT failed: datatype mismatch
./tmp.csv:25192: expected 6 columns but found 1 - fill
ing the rest with NULL

как сделать нормально?
14 дек 18, 23:19    [21764534]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
White Owl
Member

Откуда:
Сообщений: 12405
BlackeAngel,

https://www.sqlite.org/cli.html#csv_import
15 дек 18, 00:10    [21764569]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
White Owl
Member

Откуда:
Сообщений: 12405
BlackeAngel
White Owl,

Почему тогда это
sqlite3 $db_file ".mode csv .import $temp_txt words"

Не работает? Просто моргает, а ничего не вставляет?
Я делаю просто: достаю данные в файл csv из таблицы в бд, чищу таблицу и пытаюсь экспортированные данные из csv засунуть обратно - ничего не происходит.
Это не работает, потому что две команды с точкой одновременно дать нельзя.
И оно не моргает, а ругается.
15 дек 18, 00:36    [21764590]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
White Owl
Member

Откуда:
Сообщений: 12405
BlackeAngel
White Owl,
А если делать так:
Экспортирую в csv через
sqlite3 -csv $db_file "select * from words;" > $tmp_file

А затем не трогая его очищаю таблицу, и импортирую файл csv который только что эксортировал вот так
sqlite3 $db_file ".import $tmp_file words"
А кто будет говорить что импорт тоже будет из csv?
15 дек 18, 00:37    [21764592]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
Dima T
Member

Откуда:
Сообщений: 14031
В начало скрипта добавь
pragma read_uncommitted=ON;
pragma synhronous=OFF;
pragma journal_mode=OFF;

И делай копию базы перед запуском скрипта.

PS Эти прагмы ускоряют, но в случае сбоя компа во время изменения базы - база может поломаться.
15 дек 18, 06:15    [21764620]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
BlackeAngel
Member

Откуда:
Сообщений: 548
White Owl,

И как тогда сказать ему об этом, что тоже формата csv? Глядя на справку "-csv" это ключ для для экспорта.


На счёт импорта файла csv/txt - выдаёт одну и ту же ошибку про несовместимость типов данных. Но почему? Я ж только что достал из бд эти данные.
15 дек 18, 06:15    [21764621]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
White Owl
Member

Откуда:
Сообщений: 12405
BlackeAngel
White Owl,

И как тогда сказать ему об этом, что тоже формата csv? Глядя на справку "-csv" это ключ для для экспорта.
А экспериментировать тебе религия запрещает?

BlackeAngel
На счёт импорта файла csv/txt - выдаёт одну и ту же ошибку про несовместимость типов данных. Но почему? Я ж только что достал из бд эти данные.
Ну может все-же покажешь ddl своей таблицы?
15 дек 18, 17:29    [21764870]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
BlackeAngel
Member

Откуда:
Сообщений: 548
White Owl,
На счёт религии - не пробовал, но почитал хелп.

Вот бд

К сообщению приложен файл (user_dict.7z - 95Kb) cкачать
15 дек 18, 22:19    [21765001]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
Karbafos
Member

Откуда:
Сообщений: 457
BlackeAngel
White Owl,
На счёт религии - не пробовал, но почитал хелп.

Вот бд


2 минуты в гугле

sqlite3 $db_file <<END_COMMANDS
.mode csv
.import $tmp_file users
END_COMMANDS


printf ".mode csv\n.import $tmp_file users\n" | sqlite3 $db_file
16 дек 18, 02:09    [21765116]     Ответить | Цитировать Сообщить модератору
 Re: Импорт файла в базу данных через sqlite3  [new]
BlackeAngel
Member

Откуда:
Сообщений: 548
Karbafos,

А вот то что вот так параметры можно подавать - не знал. Спасибо! Вроде работает.
16 дек 18, 15:25    [21765320]     Ответить | Цитировать Сообщить модератору
Все форумы / SQLite Ответить