Как импортировать загрузку файла .sql или .csv в SQLite?

115

Мне нужно выгрузить файл .sql или .csv в SQLite (я использую SQLite3 API). Я нашел только документацию для импорта / загрузки таблиц, а не целых баз данных. Прямо сейчас, когда я печатаю:

sqlite3prompt> .import FILENAME TABLE 

Я получаю синтаксическую ошибку, так как ожидается таблица, а не вся БД.

happythenewsad
источник

Ответы:

162

Для импорта из файла SQL используйте следующее:

sqlite> .read <filename>

Для импорта из файла CSV вам необходимо указать тип файла и целевую таблицу:

sqlite> .mode csv <table>
sqlite> .import <filename> <table>
Джей Игорь
источник
2
Это правильный ответ, но иногда он подавляется фанковыми / битыми CSV-файлами.
Эли
Когда я использую .read commond, появляется ошибка «не удается открыть db.sql».
Дори
2
как он получает имена столбцов, если их нет в файле csv?
sumanth232
@ krishna222, согласно документации , если таблица не существует, первая строка CSV будет использоваться как имена столбцов; если таблица существует, все строки рассматриваются как данные.
alttag 01
26

Попробуйте сделать это с помощью такой команды:

cat dump.sql | sqlite3 database.db

Очевидно, это будет работать только с операторами SQL в dump.sql. Я не знаю, как импортировать CSV.

Кайл Кронин
источник
Я думаю, что это будет работать точно так же, но пользователь должен будет убедиться, что настройки .mode csv
sqlite3
Просто хочу сделать здесь комментарий, это на самом деле 100% мертвый, sqlite3 database.db < dump.sqlТАК МЕДЛЕННО !!! Так что используйте cat dump.sql | sqlite3 database.dbвместо этого! : D
Хавьер Баззи
@JavierBuzzi: Извините, но это бессмысленно. Эти два метода эквивалентны. У вас должно быть что-то еще происходило, когда вы пробовали тот или иной метод. В стабильных условиях тестирования я гарантирую, что разницы в скорости не будет.
IcarusNM
22

Чтобы перейти от SCRATCH с SQLite DB к импорту CSV в таблицу:

  • Скачайте SQLite с веб-сайта.
  • В командной строке запустите sqlite3 <your_db_file_name>* Он будет создан как пустой файл.
  • Создайте новую таблицу в своей новой базе данных. Таблица должна соответствовать вашим полям CSV для импорта.
  • Вы делаете это с помощью команды SQL: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

После того, как вы создали таблицу и столбцы соответствуют вашим данным из файла, вы можете сделать это ...

.mode csv <table_name>
.import <filename> <table_name>
Джейк Вайман
источник
@jacob просто к сведению, этому ответу почти 4 года, и человек, который его опубликовал, не был здесь более трех лет.
Эндрю Барбер,
Ты спас мои недели. Я закончил свою работу за 3 секунды. Я преобразовал файл CSV размером 120 МБ в .db всего за 5 секунд.
zackygaurav
11

Команда sqlite3 .import не будет работать с обычными данными CSV, поскольку она рассматривает любую запятую как разделитель даже в строке в кавычках.

Это включает попытку повторно импортировать CSV-файл, созданный оболочкой:

Create table T (F1 integer, F2 varchar);
Insert into T values (1, 'Hey!');
Insert into T values (2, 'Hey, You!');

.mode csv
.output test.csv
select * from T;

Contents of test.csv:
1,Hey!
2,"Hey, You!"

delete from T;

.import test.csv T
Error: test.csv line 2: expected 2 columns of data but found 3

Кажется, мы должны преобразовать csv в список операторов Insert, или, возможно, подойдет другой разделитель.

В SuperUser я увидел предложение использовать LogParser для работы с CSV-файлами, я собираюсь изучить это.

blairxy
источник
blairxy: Вы получаете ошибку из-за запятой в «Эй, ты!». При загрузке 2-й строки Sqlite видит 3 столбца, и после удаления 2-й запятой вы можете загрузить его без ошибок.
Шива
10

Если вы счастливы использовать скрипт (python), то есть скрипт python, который автоматизирует это по адресу: https://github.com/rgrp/csv2sqlite

Это автоматически создаст таблицу для вас, а также выполнит некоторые базовые действия по подбору типов и преобразованию данных (например, он определит, что что-то является числом, и установит тип столбца на «реальный»).

Руфус Поллок
источник
Почти работает - строка заголовка импортирует ОК. Однако затем я получаю sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings# csv2sqlite.py {csv-file-path} {sqlite-db-path} [{table-name}]
Маркос
Хммм, я никогда не видел эту ошибку, используя это. Вы использовали данные, отличные от юникода или utf8? В этом случае вам может потребоваться настроить скрипт, чтобы открыть файл CSV с использованием определенной кодировки, которую он использует.
Руфус Поллок
Примерно в то же время я написал сценарий ruby, который делает то же самое !! Он даже должен работать с несколькими CSV-файлами одновременно, угадывая имя таблицы по имени файла. github.com/dergachev/csv2sqlite
Дергачев
Нам нужно будет читать из sys.stdin, поскольку нам нужно преобразовать файл csv.gz объемом 60 ГБ. Или есть шанс получить поддержку чтения gzip в csv2sqlite? Спасибо!
markusN
@markusN открыть проблему на трекере github. Как правило, я бы беспокоился о файле CSV размером 100 ГБ + в sqlite (есть ли у вас какие-либо мысли о «правильном» RDB, например, postgres или даже о большом запросе, красном смещении и т. Д.
Руфус Поллок
1

SQLite чрезвычайно гибок, поскольку он также позволяет использовать специфические для SQLite команды с точкой в синтаксисе SQL (хотя они интерпретируются CLI). Это означает, что вы можете делать такие вещи.

Создайте такую smsтаблицу:

# sqlite3 mycool.db '.schema sms'
CREATE TABLE sms (_id integer primary key autoincrement, Address VARCHAR, Display VARCHAR, Class VARCHAR, ServiceCtr VARCHAR, Message VARCHAR, Timestamp TIMESTAMP NOT NULL DEFAULT current_timestamp);

Затем два файла:

# echo "1,ADREZZ,DizzPlay,CLAZZ,SMSC,DaTestMessage,2015-01-24 21:00:00">test.csv

# cat test.sql
.mode csv
.header on
.import test.csv sms

Чтобы проверить импорт файла CSV с помощью файла SQL, запустите:

# sqlite3 -csv -header mycool.db '.read test.sql'

В заключение, это означает, что вы можете использовать .importоператор в SQLite SQL так же, как и в любой другой RDB, например MySQL LOAD DATA INFILEи т. Д. Однако это не рекомендуется.

not2qubit
источник
1

Ознакомьтесь с termsql. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Он преобразует текст в SQL в командной строке. (CSV - это просто текст)

Пример:

cat textfile | termsql -o sqlite.db

По умолчанию разделителем является пробел, поэтому, чтобы он работал с CSV, в котором используются запятые, вы должны сделать это так:

cat textfile | termsql -d ',' -o sqlite.db

в качестве альтернативы вы можете сделать это:

termsql -i textfile -d ',' -o sqlite.db

По умолчанию он будет генерировать имена столбцов «COL0», «COL1», если вы хотите, чтобы он использовал первую строку для имен столбцов, сделайте следующее:

termsql -i textfile -d ',' -1 -o sqlite.db

Если вы хотите установить собственные имена столбцов, сделайте следующее:

termsql -i textfile -d ',' -c 'id,name,age,color' -o sqlite.db
user3573558
источник
1

если вы используете его в Windows, обязательно добавьте путь к базе данных в "", а также используйте двойную косую черту \ в пути, чтобы убедиться, что окна его понимают.

Mahd
источник
0

Вот как вы можете вставить в столбец идентичности:

CREATE TABLE my_table (id INTEGER PRIMARY KEY AUTOINCREMENT, name COLLATE NOCASE);
CREATE TABLE temp_table (name COLLATE NOCASE);

.import predefined/myfile.txt temp_table 
insert into my_table (name) select name from temp_table;

myfile.txt - это файл в C: \ code \ db \ предопределенный \

data.db находится в C: \ code \ db \

myfile.txt содержит строки, разделенные символом новой строки.

Если вы хотите добавить больше столбцов, их проще разделить с помощью вертикальной черты, которая используется по умолчанию.

живи любя
источник
-1

Импортируйте ваш csv или sql в sqlite с помощью phpLiteAdmin , это отлично.

Карра Макс
источник