Как автоматизировать процесс с помощью 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

sqlite3 abc.db ".read scriptname.sql"

на данный момент я не уверен, что еще я могу добавить, кроме того, у меня возникли проблемы с добавлением переменной среды 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


   here trans is table name and trans.csv is a csv file in which i have 1959 rows of data

    $ sqlite3 abc.db ".separator ','"
    $ sqlite3 abc.db ".import 'trans.csv' trans"
    $ sqlite3 abc.db "select count(*) from trans;"
    1959

но его невозможно написать, как вы написали