Як імпортувати завантаження .sql або .csv-файлу в SQLite?


115

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

sqlite3prompt> .import FILENAME TABLE 

Я отримую синтаксичну помилку, оскільки очікує таблицю, а не всю БД.


Відповіді:


162

Для імпорту з файлу SQL використовуйте наступне:

sqlite> .read <filename>

Щоб імпортувати з CSV-файлу, вам потрібно вказати тип файлу та таблицю призначення:

sqlite> .mode csv <table>
sqlite> .import <filename> <table>

2
Це правильна відповідь, але іноді він задихається у фанк-файлах CSV.
Елі

Це помилка "не вдається відкрити db.sql", коли я використовую .read commond.
Dory

2
як воно отримує назви стовпців, якщо вони відсутні у файлі csv?
sumanth232

@ krishna222, згідно документації , якщо таблиці не існує, перший рядок CSV буде використаний як назви стовпців; якщо таблиця існує, всі рядки розглядаються як дані.
альттаг

26

Спробуйте зробити це з команди типу:

cat dump.sql | sqlite3 database.db

Це, очевидно, буде працювати лише з операторами SQL у dump.sql. Я не впевнений, як імпортувати CSV.


Я думаю, що це буде працювати так само, але користувачеві доведеться переконатися, що налаштування sqlite3 були встановлені для.mode csv
FilBot3

Просто хочу тут прокоментувати, це насправді на 100% загинуло, sqlite3 database.db < dump.sqlце SOOOO SLOW !!! Тож використовуйте 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 просто fyi, цій відповіді майже 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: Помилка, яку ви отримуєте, пов’язана з комою в "Ей, ти!". Під час завантаження 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}]
Маркос

Гммм, я ніколи не бачив цієї помилки, використовуючи це. Ви використовували дані unicode або non-utf8? Якщо це так, вам може знадобитися налаштувати скрипт, щоб відкрити файл CSV, використовуючи специфічне кодування, яке він використовує.
Руфус Поллок

Приблизно в той же час я написав рубіновий сценарій, який робить те саме! Він навіть повинен працювати над кількома файлами CSV одночасно, відгадуючи назву таблиці з імені файлу. github.com/dergachev/csv2sqlite
Дергачов

Нам потрібно прочитати з sys.stdin, оскільки нам потрібно конвертувати файл csv.gz 60 Гб. Або, чи є можливість отримати підтримку читання gzip в csv2sqlite? Дякую!
markusN

@markusN відкрийте проблему на трекері github. Як правило, я б потурбувався про файл 100 ГБ + CSV у sqlite (у вас є хоч про "належний" RDB, наприклад, postgres або навіть bigquery, червоний зміна тощо)
Rufus Pollock,


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тощо. Однак це не рекомендується.


1

Ознайомтеся з умовамиql. 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

1

якщо ви використовуєте його у Windows, обов'язково додайте шлях до db в "", а також використовуйте подвійну косу рису \ в шляху, щоб переконатися, що Windows це розуміє.


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: \ код \ db \

myfile.txt містить рядки, розділені символом нового рядка.

Якщо ви хочете додати більше стовпців, їх простіше відокремити за допомогою символу труби, що є за замовчуванням.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.