Bagaimana cara mengimpor load file .sql atau .csv ke SQLite?


115

Saya perlu membuang file .sql atau .csv ke SQLite (Saya menggunakan API SQLite3). Saya hanya menemukan dokumentasi untuk mengimpor / memuat tabel, bukan seluruh database. Sekarang, saat saya mengetik:

sqlite3prompt> .import FILENAME TABLE 

Saya mendapatkan kesalahan sintaks, karena mengharapkan tabel dan bukan seluruh DB.


Jawaban:


162

Untuk mengimpor dari file SQL gunakan yang berikut ini:

sqlite> .read <filename>

Untuk mengimpor dari file CSV, Anda perlu menentukan jenis file dan tabel tujuan:

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

2
Ini adalah jawaban yang benar, tetapi terkadang file CSV yang funky / rusak tersedak.
Eli

Ini memberikan kesalahan "tidak dapat membuka db.sql", ketika saya menggunakan .read commond.
Dory

2
bagaimana cara mendapatkan nama kolom, jika tidak ada di file csv?
sumanth232

@ krishna222, sesuai dokumentasi , jika tabel tidak ada, baris pertama CSV akan digunakan sebagai nama kolom; jika tabel memang ada, semua baris akan diperlakukan sebagai data.
alttag

26

Coba lakukan dari perintah seperti:

cat dump.sql | sqlite3 database.db

Ini jelas hanya akan bekerja dengan pernyataan SQL di dump.sql. Saya tidak yakin bagaimana cara mengimpor CSV.


Saya pikir ini akan bekerja dengan cara yang sama, tetapi pengguna harus memastikan bahwa pengaturan sqlite3 telah disiapkan untuk.mode csv
FilBot3

Cuma mau beri komentar di sini, ini sebenarnya sudah 100% mati, sqlite3 database.db < dump.sqlSANGAT LAMBAT !!! Jadi gunakan cat dump.sql | sqlite3 database.dbsaja! : D
Javier Buzzi

@ JavierBuzzi: Maaf, tapi itu tidak masuk akal. Kedua metode itu setara. Anda pasti mengalami sesuatu yang lain ketika Anda mencoba satu metode atau yang lain. Dalam kondisi pengujian yang stabil, saya jamin tidak akan ada perbedaan kecepatan.
IcarusNM

22

Untuk beralih dari SCRATCH dengan SQLite DB untuk mengimpor CSV ke dalam tabel:

  • Dapatkan SQLite dari situs web.
  • Saat menjalankan command prompt sqlite3 <your_db_file_name>* Ini akan dibuat sebagai file kosong.
  • Buat tabel baru di database baru Anda. Tabel harus cocok dengan bidang CSV Anda untuk diimpor.
  • Anda melakukan ini dengan perintah SQL: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

Setelah Anda membuat tabel dan kolom cocok dengan data Anda dari file, maka Anda dapat melakukan hal di atas ...

.mode csv <table_name>
.import <filename> <table_name>

@jacob just fyi, jawaban ini hampir 4 tahun dan orang yang mempostingnya belum pernah ke sini selama lebih dari tiga tahun.
Andrew Barber

Anda menyelamatkan minggu saya. Saya menyelesaikan pekerjaan saya dalam 3 detik. Saya mengonversi file CSV 120MB menjadi .db hanya dalam 5 detik.
zackygaurav

11

Perintah sqlite3 .import tidak akan berfungsi untuk data csv biasa karena ia memperlakukan setiap koma sebagai pemisah bahkan dalam string yang dikutip.

Ini termasuk mencoba mengimpor kembali file csv yang dibuat oleh shell:

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

Tampaknya kita harus mengubah csv menjadi daftar pernyataan Sisipkan, atau mungkin pemisah yang berbeda akan berfungsi.

Selama di SuperUser saya melihat saran untuk menggunakan LogParser untuk menangani file csv, saya akan memeriksanya.


blairxy: Kesalahan yang Anda dapatkan disebabkan oleh koma di "Hei, Kamu!". Saat memuat baris ke-2 Sqlite melihat 3 kolom dan saat menghapus koma ke-2 Anda dapat memuatnya tanpa kesalahan.
Siwa

10

Jika Anda senang menggunakan skrip (python) maka ada skrip python yang mengotomatiskan ini di: https://github.com/rgrp/csv2sqlite

Ini akan membuat tabel secara otomatis untuk Anda serta melakukan beberapa tebakan tipe dasar dan transmisi data untuk Anda (jadi misalnya, ini akan menghasilkan sesuatu berupa angka dan menyetel tipe kolom ke "nyata").


Hampir berfungsi - impor baris tajuk OK. Namun kemudian saya mendapatkan 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}]
Marcos

Hmmm, saya belum pernah melihat kesalahan itu menggunakan ini. Apakah Anda menggunakan data non-unicode atau non-utf8? Jika demikian, Anda mungkin perlu mengubah skrip untuk membuka file CSV menggunakan pengkodean khusus yang digunakannya.
Rufus Pollock

Sekitar waktu yang sama, saya menulis skrip ruby ​​yang melakukan hal yang sama !! Ini bahkan harus bekerja pada beberapa file CSV sekaligus, menebak nama tabel dari nama file. github.com/dergachev/csv2sqlite
Dergachev

Kita perlu membaca dari sys.stdin karena kita perlu mengonversi file csv.gz 60GB. Atau, apakah ada peluang untuk mendapatkan dukungan baca gzip ke csv2sqlite? Terima kasih!
markusN

@markusN membuka masalah di pelacak github. Secara umum, saya akan khawatir tentang file CSV 100GB + di sqlite (pernahkah Anda memikirkan tentang RDB yang "tepat" misalnya postgres atau bahkan bigquery, redshift dll
Rufus Pollock


1

SQLite sangat fleksibel karena juga memungkinkan perintah titik khusus SQLite dalam sintaks SQL, (meskipun ditafsirkan oleh CLI.) Ini berarti Anda dapat melakukan hal-hal seperti ini.

Buat smstabel seperti ini:

# 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);

Lalu dua file:

# 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

Untuk menguji impor file CSV menggunakan file SQL, jalankan:

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

Kesimpulannya, ini berarti Anda dapat menggunakan .importpernyataan dalam SQLite SQL, seperti yang dapat Anda lakukan di RDB lainnya, seperti MySQL dengan LOAD DATA INFILEdll. Namun, ini tidak disarankan.


1

Lihat termql. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Ini mengubah teks menjadi SQL pada baris perintah. (CSV hanyalah teks)

Contoh:

cat textfile | termsql -o sqlite.db

Secara default, pembatasnya adalah spasi, jadi untuk membuatnya berfungsi dengan CSV yang menggunakan komata, Anda akan melakukannya seperti ini:

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

sebagai alternatif Anda dapat melakukan ini:

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

Secara default ini akan menghasilkan nama kolom "COL0", "COL1", jika Anda ingin menggunakan baris pertama untuk nama kolom, lakukan ini:

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

Jika Anda ingin mengatur nama kolom kustom, Anda melakukan ini:

termsql -i textfile -d ',' -c 'id,name,age,color' -o sqlite.db

1

jika Anda menggunakannya di windows, pastikan untuk menambahkan path ke db di "" dan juga menggunakan garis miring \ di path untuk memastikan windows memahaminya.


0

Beginilah cara Anda memasukkan ke dalam kolom identitas:

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 adalah file di C: \ code \ db \ predefined \

data.db ada di C: \ code \ db \

myfile.txt berisi string yang dipisahkan oleh karakter baris baru.

Jika Anda ingin menambahkan lebih banyak kolom, lebih mudah untuk memisahkannya menggunakan karakter pipa, yang merupakan defaultnya.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.