Как использовать команду импорта SQLite3 с использованием C API? - PullRequest
1 голос
/ 26 октября 2009

У меня есть следующий код:

int rc;
rc = sqlite3_exec(sqlite3_database, ".import mydata.csv mytable", callback, 0, &errMsg);

После запуска errMsg содержит следующее сообщение об ошибке:

near ".": syntax error

Я предполагаю, что он не распознает команду импорта. Однако эта команда работает при запуске из программы sqlite3 в командной строке.

Мне нужно иметь возможность использовать команду импорта непосредственно в моей программе. Есть ли способ, которым я могу сделать это? Причина, по которой мне нужно использовать команду импорта, заключается в том, что выполнение вставок для каждой строки файла CSV занимает более 5 минут, а команда импорта занимает доли секунды.

Ответы [ 4 ]

8 голосов
/ 26 октября 2009

Оболочка командной строки .import не является частью C API; инструмент sqlite3 реализует его как

sqlite3_prepare(..., "INSERT INTO '...' VALUES (?, ..., ?)", ...);
sqlite3_exec(..., "BEGIN", ...);
for (each entry) {
    for (each column) sqlite3_bind_text(..., column, ...);
    sqlite3_step(...);
}
sqlite3_exec(..., "COMMIT", ...);

с некоторой проверкой ошибок (ROLLBACK, если что-то пойдет не так) и обработкой подготовленного оператора (sqlite3_reset, sqlite3_finalize).

3 голосов
/ 21 апреля 2013

Будучи довольно старым постом, я просто хотел обновить его только для справки.

Существует API с открытым исходным кодом, который я поддерживаю для функций импорта / экспорта API SQLite3 C / C ++. Код можно получить по этой ссылке

2 голосов
/ 26 октября 2009

.import является частью программного интерфейса командной строки, а не C API, как мне кажется. Вы можете (как я это сделал) настроить все свои данные в файле базы данных SQLite3, используя другой инструмент, а затем включить этот файл базы данных в свое приложение. Затем, когда вы открываете его в своем коде, данные уже там.

1 голос
/ 26 октября 2009

Я подозреваю, что вставка занимает так много времени, потому что вы используете SQLite для повторной обработки вашего оператора INSERT для каждой строки (то есть, используя sqlite3_exec () ) вместо использования параметризованного подготовленный оператор (то есть, используя sqlite3_prepare_v2 () , sqlite_bind _ * () и sqlite3_step () ). Как сказано выше, вот как импорт реализован внутри.

Я полагаю, что использование параметризованного оператора должно достигать той же производительности, что и .import.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...