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.


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>

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.


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>

@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: 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”).


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.


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

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.


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.