Làm cách nào để tải tải tệp .sql hoặc .csv vào SQLite?


115

Tôi cần kết xuất tệp .sql hoặc .csv vào SQLite (Tôi đang sử dụng API SQLite3). Tôi chỉ tìm thấy tài liệu để nhập / tải bảng, không phải toàn bộ cơ sở dữ liệu. Ngay bây giờ, khi tôi gõ:

sqlite3prompt> .import FILENAME TABLE 

Tôi gặp lỗi cú pháp, vì nó mong đợi một bảng chứ không phải toàn bộ DB.


Câu trả lời:


162

Để nhập từ tệp SQL, hãy sử dụng như sau:

sqlite> .read <filename>

Để nhập từ tệp CSV, bạn sẽ cần chỉ định loại tệp và bảng đích:

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

2
Đây là câu trả lời đúng, nhưng đôi khi nó làm nghẹt các tệp CSV vui nhộn / bị hỏng.
Eli

Đó là lỗi "không thể mở db.sql", khi tôi đang sử dụng .read commond.
Dory

2
Làm thế nào để nó có được tên cột, nếu chúng không có trong tệp csv?
sumanth 232

@ krishna222, theo tài liệu , nếu bảng không tồn tại, dòng đầu tiên của CSV sẽ được sử dụng làm tên cột; nếu bảng tồn tại, tất cả các hàng được coi là dữ liệu.
alttag

26

Hãy thử làm nó từ lệnh như:

cat dump.sql | sqlite3 database.db

Điều này rõ ràng sẽ chỉ hoạt động với các câu lệnh SQL trong dump.sql. Tôi không chắc chắn cách nhập CSV.


Tôi nghĩ rằng điều này sẽ hoạt động giống nhau, nhưng người dùng sẽ phải đảm bảo rằng các cài đặt sqlite3 đã được thiết lập cho.mode csv
FilBot3

Chỉ muốn bình luận ở đây, đây thực sự là 100% đã chết, sqlite3 database.db < dump.sqllà SOOOO SLOW !!! Vì vậy, sử dụng cat dump.sql | sqlite3 database.dbthay thế! : D
Javier Buzzi

@JavierBuzzi: Xin lỗi nhưng điều đó vô nghĩa. Hai phương pháp đó là tương đương. Bạn phải có một cái gì đó khác xảy ra khi bạn thử phương pháp này hay phương pháp khác. Trong điều kiện thử nghiệm ổn định tôi đảm bảo sẽ không có chênh lệch tốc độ.
IcarusNM

22

Để đi từ SCRATCH với SQLite DB để nhập CSV vào bảng:

  • Nhận SQLite từ trang web.
  • Tại một dấu nhắc lệnh chạy sqlite3 <your_db_file_name>* Nó sẽ được tạo dưới dạng một tệp trống.
  • Tạo một bảng mới trong cơ sở dữ liệu mới của bạn. Bảng phải khớp với các trường CSV của bạn để nhập.
  • Bạn làm điều này bằng lệnh SQL: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

Khi bạn đã tạo bảng và các cột khớp với dữ liệu của bạn từ tệp thì bạn có thể thực hiện các thao tác trên ...

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

@jacob chỉ cần fyi, câu trả lời này đã gần 4 tuổi và người đăng nó đã không ở đây trong hơn ba năm.
Andrew Barber

Bạn đã lưu tuần của tôi. Tôi đã hoàn thành công việc của mình trong 3 giây. Tôi đã chuyển đổi tệp CSV 120 MB thành .db chỉ trong 5 giây.
zackygaurav

11

Lệnh sqlite3 .import sẽ không hoạt động đối với dữ liệu csv thông thường vì nó xử lý bất kỳ dấu phẩy nào dưới dạng dấu phân cách ngay cả trong chuỗi được trích dẫn.

Điều này bao gồm cố gắng nhập lại tệp csv được tạo bởi trình bao:

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

Có vẻ như chúng ta phải chuyển đổi csv thành một danh sách các câu lệnh Chèn, hoặc có lẽ một dấu phân cách khác sẽ hoạt động.

Ở SuperUser tôi thấy một đề nghị sử dụng LogParser để xử lý các tệp csv, tôi sẽ xem xét điều đó.


blairxy: Lỗi bạn gặp phải là do dấu phẩy trong "Hey, You!". Trong khi tải dòng thứ 2, Sqlite nhìn thấy 3 cột và khi xóa dấu phẩy thứ 2, bạn có thể tải nó mà không gặp lỗi.
Shiva

10

Nếu bạn hài lòng khi sử dụng tập lệnh (python) thì có tập lệnh python tự động hóa tập lệnh này tại: https://github.com/rgrp/csv2sqlite

Điều này sẽ tự động tạo bảng cho bạn cũng như thực hiện một số thao tác đoán và truyền dữ liệu cơ bản cho bạn (ví dụ: nó sẽ tìm ra thứ gì đó là một số và đặt loại cột thành "thực").


Hầu như hoạt động - hàng tiêu đề nhập OK. Tuy nhiên, sau đó tôi nhận được 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} [{tên bảng}]
Marcos

Hmmm, tôi chưa bao giờ thấy lỗi đó bằng cách sử dụng này. Bạn đã sử dụng dữ liệu không phải là unicode hay non-utf8? Nếu vậy, bạn có thể cần phải điều chỉnh tập lệnh để mở tệp CSV bằng cách sử dụng mã hóa cụ thể mà nó đang sử dụng.
Rufus Pollock

Cũng trong khoảng thời gian đó, tôi đã viết một kịch bản ruby ​​cũng làm điều tương tự !! Nó thậm chí sẽ hoạt động trên nhiều tệp CSV cùng một lúc, đoán tên bảng từ tên tệp. github.com/dergachev/csv2sqlite
Dergachev

Chúng tôi sẽ cần đọc từ sys.stdin vì chúng tôi cần chuyển đổi tệp csv.gz 60GB. Hoặc, liệu có cơ hội nhận được hỗ trợ đọc gzip vào csv2sqlite không? Cảm ơn!
markusN

@markusN mở một vấn đề trên trình theo dõi github. Nói chung, tôi sẽ lo lắng về tệp 100GB + CSV trong sqlite (bạn có biết về một RDB "phù hợp" hay không, ví dụ như postgres hoặc thậm chí bigquery, redshift, v.v.
Rufus Pollock


1

SQLite cực kỳ linh hoạt vì nó cũng cho phép các lệnh chấm cụ thể SQLite trong cú pháp SQL, (mặc dù chúng được CLI diễn giải.) Điều này có nghĩa là bạn có thể làm những việc như thế này.

Tạo một smsbảng như thế này:

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

Sau đó, hai tập tin:

# 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

Để kiểm tra việc nhập tệp CSV bằng tệp SQL, hãy chạy:

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

Tóm lại, điều này có nghĩa là bạn có thể sử dụng .importcâu lệnh trong SQLite SQL, giống như bạn có thể làm trong bất kỳ RDB nào khác, như MySQL với, LOAD DATA INFILEv.v. Tuy nhiên, điều này không được khuyến khích.


1

Kiểm tra thuật ngữ. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Nó chuyển đổi văn bản thành SQL trên dòng lệnh. (CSV chỉ là văn bản)

Thí dụ:

cat textfile | termsql -o sqlite.db

Theo mặc định, dấu phân cách là khoảng trắng, vì vậy để làm cho nó hoạt động với CSV đang sử dụng dấu phẩy, bạn sẽ làm như thế này:

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

Ngoài ra, bạn có thể làm điều này:

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

Theo mặc định, nó sẽ tạo các tên cột "COL0", "COL1", nếu bạn muốn nó sử dụng hàng đầu tiên cho các tên cột bạn làm điều này:

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

Nếu bạn muốn đặt tên cột tùy chỉnh, bạn làm điều này:

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

1

nếu bạn đang sử dụng nó trong windows, hãy nhớ thêm đường dẫn vào db trong "" và cũng sử dụng dấu gạch chéo kép \ trong đường dẫn để đảm bảo windows hiểu nó.


0

Đây là cách bạn có thể chèn vào cột nhận dạng:

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 là một tệp trong C: \ code \ db \ được xác định trước \

data.db nằm trong C: \ code \ db \

myfile.txt chứa các chuỗi được phân tách bằng ký tự dòng mới.

Nếu bạn muốn thêm nhiều cột, việc phân tách chúng bằng ký tự ống dễ dàng hơn, đó là mặc định.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.