Como importar carregar um arquivo .sql ou .csv para o SQLite?


115

Preciso despejar um arquivo .sql ou .csv no SQLite (estou usando a API SQLite3). Só encontrei documentação para importar / carregar tabelas, não bancos de dados inteiros. Agora, quando digito:

sqlite3prompt> .import FILENAME TABLE 

Recebo um erro de sintaxe, pois ele está esperando uma tabela e não um banco de dados inteiro.


Respostas:


162

Para importar de um arquivo SQL, use o seguinte:

sqlite> .read <filename>

Para importar de um arquivo CSV, você precisará especificar o tipo de arquivo e a tabela de destino:

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

2
Esta é a resposta certa, mas às vezes engasga com arquivos CSV estranhos / corrompidos.
Eli

Ele está apresentando o erro "não é possível abrir db.sql", quando estou usando .read commond.
Dory

2
como ele obtém os nomes das colunas, se eles não estão presentes no arquivo csv?
sumanth232

@ krishna222, de acordo com a documentação , se a tabela não existir, a primeira linha do CSV será usada como nome das colunas; se a tabela existir, todas as linhas serão tratadas como dados.
alttag 01 de

26

Tente fazer a partir do comando como:

cat dump.sql | sqlite3 database.db

Obviamente, isso só funcionará com instruções SQL em dump.sql. Não tenho certeza de como importar um CSV.


Acho que funcionaria da mesma forma, mas o usuário teria que se certificar de que as configurações de sqlite3 foram definidas para.mode csv
FilBot3

Só quero fazer um comentário aqui, isso está realmente 100% certo, sqlite3 database.db < dump.sqlé SOOOO LENTO !!! Portanto, use cat dump.sql | sqlite3 database.db! : D
Javier Buzzi

@JavierBuzzi: Desculpe, mas isso não faz sentido. Esses dois métodos são equivalentes. Você deve ter tido algo mais acontecendo quando tentou um método ou outro. Em condições de teste estáveis, garanto que não haverá diferença de velocidade.
IcarusNM de

22

Para ir de SCRATCH com SQLite DB para importar o CSV para uma tabela:

  • Obtenha o SQLite no site.
  • Em um prompt de comando, execute sqlite3 <your_db_file_name>* Ele será criado como um arquivo vazio.
  • Faça uma nova tabela em seu novo banco de dados. A tabela deve corresponder aos seus campos CSV para importação.
  • Você faz isso pelo comando SQL: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

Depois de criar a tabela e as colunas corresponderem aos dados do arquivo, você pode fazer o acima ...

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

@jacob só para constar, esta resposta tem quase 4 anos e a pessoa que a postou não está aqui há mais de três anos.
Andrew Barber,

Você salvou minhas semanas. Terminei meu trabalho em 3 segundos. Converti um arquivo CSV de 120 MB para .db em meros 5 segundos.
zackygaurav

11

O comando sqlite3 .import não funcionará para dados csv comuns porque trata qualquer vírgula como um delimitador, mesmo em uma string entre aspas.

Isso inclui tentar reimportar um arquivo csv que foi criado pelo 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

Parece que devemos transformar o csv em uma lista de instruções Insert, ou talvez um delimitador diferente funcione.

No SuperUser, vi uma sugestão para usar o LogParser para lidar com arquivos csv, vou dar uma olhada nisso.


blairxy: O erro que você está recebendo é devido à vírgula em "Ei, você!". Enquanto carrega a 2ª linha, o Sqlite vê 3 colunas e ao remover a 2ª vírgula você pode carregá-lo sem erros.
Shiva

10

Se você estiver satisfeito em usar um script (python), então existe um script python que o automatiza em: https://github.com/rgrp/csv2sqlite

Isso criará automaticamente a tabela para você, bem como fará algumas adivinhações básicas de tipo e conversão de dados para você (então, por exemplo, ele descobrirá que algo é um número e definirá o tipo de coluna como "real").


Quase funciona - a linha do cabeçalho é importada OK. No entanto, eu obtenho 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 {caminho do arquivo csv} {caminho do banco de dados sqlite} [{nome da tabela}]
Marcos

Hmmm, nunca vi esse erro ao usar isso. Você estava usando dados não unicode ou não utf8? Nesse caso, pode ser necessário ajustar o script para abrir o arquivo CSV usando a codificação específica que está usando.
Rufus Pollock

Mais ou menos na mesma época, escrevi um script ruby ​​que faz a mesma coisa !! Ele deve até funcionar em vários arquivos CSV ao mesmo tempo, adivinhando o nome da tabela a partir do nome do arquivo. github.com/dergachev/csv2sqlite
Dergachev

Precisamos ler sys.stdin, pois precisamos converter um arquivo csv.gz de 60 GB. Ou haveria uma chance de obter suporte de leitura gzip para csv2sqlite? Obrigado!
markusN

@markusN abre um problema no rastreador github. Geralmente, eu me preocuparia com um arquivo CSV de 100 GB + em sqlite (você já pensou sobre um RDB "adequado", por exemplo, postgres ou mesmo bigquery, redshift etc
Rufus Pollock


1

O SQLite é extremamente flexível, pois também permite os comandos de pontos específicos do SQLite na sintaxe SQL (embora sejam interpretados pela CLI). Isso significa que você pode fazer coisas assim.

Crie uma smstabela como esta:

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

Em seguida, dois arquivos:

# 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

Para testar a importação do arquivo CSV usando o arquivo SQL, execute:

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

Em conclusão, isso significa que você pode usar a .importinstrução no SQLite SQL, da mesma forma que você pode fazer em qualquer outro RDB, como o MySQL com LOAD DATA INFILEetc. No entanto, isso não é recomendado.


1

Confira os termosql. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Ele converte texto em SQL na linha de comando. (CSV é apenas texto)

Exemplo:

cat textfile | termsql -o sqlite.db

Por padrão, o delimitador é um espaço em branco, então para fazê-lo funcionar com CSV que usa vírgulas, você faria assim:

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

alternativamente, você pode fazer isso:

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

Por padrão, ele irá gerar os nomes das colunas "COL0", "COL1", se você quiser usar a primeira linha para os nomes das colunas, faça o seguinte:

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

Se você deseja definir nomes de coluna personalizados, faça o seguinte:

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

1

se estiver usando no windows, certifique-se de adicionar o caminho para o banco de dados em "" e também de usar barra dupla \ no caminho para ter certeza de que o Windows o entende.


0

É assim que você pode inserir em uma coluna de identidade:

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 é um arquivo em C: \ code \ db \ predefined \

data.db está em C: \ code \ db \

myfile.txt contém strings separadas por caractere de nova linha.

Se você quiser adicionar mais colunas, é mais fácil separá-las usando a barra vertical, que é o padrão.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.