Как автоматизировать процесс с помощью sqlite3.инструмент командной строки exe-файла?
Я пытаюсь массово загрузить много данных (5,5 миллионов строк ) в файл базы данных SQLite. Загрузка через вставки кажется слишком медленной, поэтому я пытаюсь использовать инструмент командной строки sqlite3 и т. д.команда Import.
Он отлично работает, если я ввожу команды вручную, но я не могу за всю свою жизнь решить, как автоматизировать его из скрипта ( .bat-файл или скрипт python; я работаю на машине с Windows ).
команды, которые я выдаю в командной строке эти:
> sqlite3 database.db
sqlite> CREATE TABLE log_entry ( <snip> );
sqlite> .separator "t"
sqlite> .import logfile.log log_entry
но ничего я не пытаюсь заставить это работать из файла bat или скрипта python.
Я пробовал такие вещи, как:
sqlite3 "database.db" .separator "t" .import logfile.log log_entry
echo '.separator "t" .import logfile.log log_entry' | sqlite3 database.db
конечно, я могу сделать это как-то?
8 ответов:
создайте текстовый файл со строками, которые вы хотите ввести в программу командной строки sqlite, например:
CREATE TABLE log_entry ( ); .separator "\t" .import logfile.log log_entryа потом просто позвоните
sqlite3 database.db < commands.txt
в качестве альтернативы вы можете поместить все в один файл сценария оболочки (таким образом, упрощая обслуживание) с помощью heredoc import.sh :
#!/bin/bash -- sqlite3 -batch <<"EOF" CREATE TABLE log_entry ( <snip> ); .separator "\t" .import logfile.log log_entry EOF
...и запустить его:
import.sh database.db
это делает его легче поддерживать только один файл скрипта. Кстати, если вам нужно запустить его под Windows, Power Shell также имеет heredoc
кроме того, этот подход помогает справиться с отсутствием поддержки параметров скрипта. Вы можете использовать bash переменные:
#!/bin/bash -- table_name=log_entry sqlite3 -batch <<EOF CREATE TABLE ${table_name} ( <snip> ); .separator "\t" .import logfile.log ${table_name} EOF
или даже сделать трюк такой:
#!/bin/bash -- table_name= sqlite3 -batch <<EOF CREATE TABLE ${table_name} ( <snip> ); .separator "\t" .import logfile.log ${table_name} EOF
...и запустить его:
import.sh database.db log_entry
создайте отдельный текстовый файл, содержащий все команды, которые вы обычно вводите в приложение оболочки sqlite3:
CREATE TABLE log_entry ( <snip> ); .separator "\t" .import /path/to/logfile.log log_entry
сохраните его как, скажем, impscript.язык SQL.
создайте пакетный файл, который вызывает оболочку sqlite3 с этим скриптом:
sqlite3.exe yourdatabase.db < /path/to/impscript.sql
вызов пакетного файла.
на боковой ноте-при импорте,обязательно оберните вставки в транзакцию! Это даст вам мгновенное ускорение 10.000%.
недавно у меня была аналогичная проблема при конвертации файлов cookie Firefox.sqlite в текстовый файл (для некоторых инструментов загрузки) и наткнулся на этот вопрос.
Я хотел сделать это с одной линией оболочки, и это было бы моим решением, примененным к вышеупомянутой проблеме:
echo -e ".mode tabs\n.import logfile.log log_entry" | sqlite3 database.db
но я еще не проверял эту линию. Но он отлично работал с проблемой Firefox, о которой я упоминал выше (кстати, через Bash на Mac OSX):
echo -e ".mode tabs\nselect host, case when host glob '.*' then 'TRUE' else 'FALSE' end, path, case when isSecure then 'TRUE' else 'FALSE' end, expiry, name, value from moz_cookies;" | sqlite3 cookies.sqlite
На данный момент я не уверен, что еще я могу добавить, кроме того, у меня были некоторые проблемы с добавлением переменной среды unix в сценарий bash, предложенный nad2000.
запуск этого:
bash dbmake.sh database.db <(sed '1d' $DATA/logfile.log | head -n 1000)
мне нужно было импортировать из stdin в качестве обходного пути, и я нашел это решение:
sqlite3 <<"EOF" CREATE TABLE log_entry; EOF sqlite3 -separator $'\t' ".import log_entry"
добавив вторую строку sqlite3, я смог передать $2 из Unix в параметр file for .импорт, полный путь и все.
на Windows, это должно работать:
(echo CREATE TABLE log_entry ( <snip> ); & echo .separator "\t" & echo .import logfile.log log_entry) | sqlite3.exe database.db
Я не тестировал эту конкретную команду, но из моего собственного стремления решить эту проблему передачи нескольких команд я обнаружил, что ключ должен был заключать Эхо-команды в круглые скобки. При этом возможно, что вам может потребоваться настроить приведенную выше команду, чтобы также избежать некоторых из этих символов. Например:
(echo CREATE TABLE log_entry ^( ^<snip^> ^); & echo .separator "\t" & echo .import logfile.log log_entry) | sqlite3.exe database.db
Я не уверен, что побег необходим в этом случае, но это весьма вероятно поскольку скобки могут конфликтовать с заключающими, то "меньше" и "больше" символы обычно интерпретируются как входные или выходные данные, которые также могут конфликтовать. Обширный список побега персонажей можно найти здесь:http://www.robvanderwoude.com/escapechars.php