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.