Jak zaimportować załadować plik .sql lub .csv do SQLite?

115

Muszę zrzucić plik .sql lub .csv do SQLite (używam interfejsu API SQLite3). Znalazłem tylko dokumentację dotyczącą importowania / ładowania tabel, a nie całych baz danych. W tej chwili, kiedy piszę:

sqlite3prompt> .import FILENAME TABLE 

Pojawia się błąd składni, ponieważ oczekuje tabeli, a nie całej bazy danych.

happythenewsad
źródło

Odpowiedzi:

162

Aby zaimportować z pliku SQL, użyj:

sqlite> .read <filename>

Aby zaimportować z pliku CSV, musisz określić typ pliku i tabelę docelową:

sqlite> .mode csv <table>
sqlite> .import <filename> <table>
Jay Igor
źródło
2
To jest właściwa odpowiedź, ale czasami dławi się funky / zepsutymi plikami CSV.
Eli
Daje błąd „nie można otworzyć db.sql”, gdy używam .read commond.
Dory
2
skąd bierze nazwy kolumn, jeśli nie ma ich w pliku csv?
sumanth232
@ krishna222, zgodnie z dokumentacją , jeśli tabela nie istnieje, pierwsza linia pliku CSV zostanie użyta jako nazwy kolumn; jeśli tabela istnieje, wszystkie wiersze są traktowane jako dane.
alttag
26

Spróbuj zrobić to za pomocą polecenia takiego jak:

cat dump.sql | sqlite3 database.db

To oczywiście zadziała tylko z instrukcjami SQL w dump.sql. Nie wiem, jak zaimportować plik CSV.

Kyle Cronin
źródło
Myślę, że to działałoby tak samo, ale użytkownik musiałby się upewnić, że ustawienia sqlite3 zostały skonfigurowane dla.mode csv
FilBot3
Chcę tylko dodać tutaj komentarz, to jest właściwie w 100% martwe, sqlite3 database.db < dump.sqljest TAKIE WOLNE !!! Więc użyj cat dump.sql | sqlite3 database.dbzamiast tego! : D
Javier Buzzi
@JavierBuzzi: Przepraszam, ale to nie ma sensu. Te dwie metody są równoważne. Musiałeś mieć coś innego, kiedy próbowałeś jednej lub drugiej metody. W stabilnych warunkach testowych gwarantuję, że nie będzie różnicy prędkości.
IcarusNM
22

Aby przejść od SCRATCH z SQLite DB do zaimportowania CSV do tabeli:

  • Pobierz SQLite ze strony internetowej.
  • W wierszu polecenia uruchom sqlite3 <your_db_file_name>* Zostanie utworzony jako pusty plik.
  • Utwórz nową tabelę w nowej bazie danych. Tabela musi pasować do pól CSV do importu.
  • Robisz to za pomocą polecenia SQL: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

Po utworzeniu tabeli i dopasowaniu kolumn do danych z pliku możesz wykonać powyższe ...

.mode csv <table_name>
.import <filename> <table_name>
Jake Wyman
źródło
@jacob tylko fyi, ta odpowiedź ma prawie 4 lata, a osoby, która ją opublikowała, nie było tu od ponad trzech lat.
Andrew Barber
Uratowałeś moje tygodnie. Skończyłem pracę w 3 sekundy. Przekonwertowałem plik CSV 120MB na .db w zaledwie 5 sekund.
zackygaurav
11

Polecenie sqlite3 .import nie będzie działać w przypadku zwykłych danych csv, ponieważ traktuje przecinek jako separator, nawet w ciągu cytowanym w cudzysłowie.

Obejmuje to próbę ponownego zaimportowania pliku CSV utworzonego przez powłokę:

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

Wygląda na to, że musimy przekształcić csv w listę instrukcji Insert, albo może zadziała inny ogranicznik.

W SuperUser widziałem sugestię, aby użyć LogParser do obsługi plików csv, przyjrzę się temu.

blairxy
źródło
blairxy: Otrzymywany błąd jest spowodowany przecinkiem w „Hej, Ty!”. Podczas wczytywania drugiej linii Sqlite widzi 3 kolumny i po usunięciu drugiego przecinka można go załadować bez błędów.
Shiva
10

Jeśli z przyjemnością używasz skryptu (python), istnieje skrypt w języku Python, który automatyzuje to pod adresem : https://github.com/rgrp/csv2sqlite

Spowoduje to automatyczne utworzenie tabeli, a także wykonanie podstawowych czynności związanych z odgadywaniem typów i rzutowaniem danych (np. Zorientuje się, że coś jest liczbą i ustawi typ kolumny na „prawdziwy”).

Rufus Pollock
źródło
Prawie działa - wiersz nagłówka importuje OK. Jednak potem dostaję 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, nigdy nie widziałem tego błędu przy użyciu tego. Czy korzystałeś z danych innych niż Unicode lub UTF8? Jeśli tak, może być konieczne dostosowanie skryptu, aby otworzyć plik CSV przy użyciu określonego kodowania, z którego korzysta.
Rufus Pollock
Mniej więcej w tym samym czasie napisałem rubinowy skrypt, który robi to samo !! Powinien nawet działać na wielu plikach CSV jednocześnie, odgadując nazwę tabeli z nazwy pliku. github.com/dergachev/csv2sqlite
Dergachev
Musielibyśmy czytać z sys.stdin, ponieważ musimy przekonwertować plik csv.gz o pojemności 60 GB. A może byłaby szansa na uzyskanie obsługi odczytu gzip w csv2sqlite? Dzięki!
markusN
@markusN otwórz problem w trackerze github. Generalnie martwiłbym się o plik CSV 100GB + w sqlite (czy myślałeś o "odpowiednim" RDB np. Postgres lub nawet bigquery, redshift itp.
Rufus Pollock
1

SQLite jest niezwykle elastyczny, ponieważ pozwala również na polecenia kropkowe specyficzne dla SQLite w składni SQL (chociaż są one interpretowane przez CLI). Oznacza to, że możesz robić takie rzeczy.

Utwórz taką smstabelę:

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

Następnie dwa pliki:

# 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

Aby przetestować import pliku CSV przy użyciu pliku SQL, uruchom:

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

Podsumowując, oznacza to, że możesz użyć .importinstrukcji w SQLite SQL, tak jak w każdym innym RDB, jak MySQL z LOAD DATA INFILEitp. Jednak nie jest to zalecane.

not2qubit
źródło
1

Sprawdź terminyql. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Konwertuje tekst na SQL w wierszu poleceń. (CSV to tylko tekst)

Przykład:

cat textfile | termsql -o sqlite.db

Domyślnie separatorem jest spacja, więc aby działał z CSV używającym przecinków, należy to zrobić w ten sposób:

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

alternatywnie możesz to zrobić:

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

Domyślnie generuje nazwy kolumn „COL0”, „COL1”, jeśli chcesz, aby używał pierwszego wiersza dla nazw kolumn, wykonaj następujące czynności:

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

Jeśli chcesz ustawić niestandardowe nazwy kolumn, wykonaj następujące czynności:

termsql -i textfile -d ',' -c 'id,name,age,color' -o sqlite.db
user3573558
źródło
1

jeśli używasz go w systemie Windows, pamiętaj, aby dodać ścieżkę do bazy danych w „”, a także użyć podwójnego ukośnika \ w ścieżce, aby upewnić się, że system Windows ją zrozumie.

MahD
źródło
0

Oto jak możesz wstawić do kolumny tożsamości:

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 to plik w C: \ code \ db \ predefined \

data.db znajduje się w C: \ code \ db \

myfile.txt zawiera ciągi oddzielone znakiem nowego wiersza.

Jeśli chcesz dodać więcej kolumn, łatwiej je rozdzielić, używając pionowej kreski, która jest domyślna.

miłość na żywo
źródło