¿Cómo importar cargar un archivo .sql o .csv en SQLite?

115

Necesito volcar un archivo .sql o .csv en SQLite (estoy usando la API SQLite3). Solo encontré documentación para importar / cargar tablas, no bases de datos completas. Ahora mismo, cuando escribo:

sqlite3prompt> .import FILENAME TABLE 

Recibo un error de sintaxis, ya que se espera una tabla y no una base de datos completa.

happythenewstriste
fuente

Respuestas:

162

Para importar desde un archivo SQL, utilice lo siguiente:

sqlite> .read <filename>

Para importar desde un archivo CSV, deberá especificar el tipo de archivo y la tabla de destino:

sqlite> .mode csv <table>
sqlite> .import <filename> <table>
Jay Igor
fuente
2
Esta es la respuesta correcta, pero a veces se ahoga con archivos CSV funky / rotos.
Eli
Está dando el error "no se puede abrir db.sql", cuando estoy usando .read commond.
Dory
2
¿Cómo obtiene los nombres de las columnas, si no están presentes en el archivo csv?
sumanth232
@ krishna222, según la documentación , si la tabla no existe, la primera línea del CSV se utilizará como nombres de columna; si la tabla existe, todas las filas se tratan como datos.
alttag
26

Intente hacerlo desde el comando como:

cat dump.sql | sqlite3 database.db

Obviamente, esto solo funcionará con declaraciones SQL en dump.sql. No estoy seguro de cómo importar un CSV.

Kyle Cronin
fuente
Creo que esto funcionaría igual, pero el usuario tendría que asegurarse de que la configuración de sqlite3 .mode csv
esté
Solo quiero hacer un comentario aquí, esto en realidad está 100% muerto, ¡ sqlite3 database.db < dump.sqles MUY LENTO! ¡Así que usa cat dump.sql | sqlite3 database.dben su lugar! : D
Javier Buzzi
@JavierBuzzi: Lo siento, pero eso no tiene sentido. Esos dos métodos son equivalentes. Debes haber tenido algo más cuando probaste un método u otro. En condiciones de prueba estables, garantizo que no habrá diferencia de velocidad.
IcarusNM
22

Para pasar de SCRATCH con SQLite DB a importar el CSV a una tabla:

  • Obtenga SQLite del sitio web.
  • En un símbolo del sistema, ejecute sqlite3 <your_db_file_name>* Se creará como un archivo vacío.
  • Crea una nueva tabla en tu nueva base de datos. La tabla debe coincidir con sus campos CSV para la importación.
  • Haz esto con el comando SQL: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

Una vez que haya creado la tabla y las columnas coincidan con sus datos del archivo, puede hacer lo anterior ...

.mode csv <table_name>
.import <filename> <table_name>
Jake Wyman
fuente
@jacob solo para tu información, esta respuesta tiene casi 4 años y la persona que la publicó no ha estado aquí en más de tres años.
Andrew Barber
Salvaste mis semanas. Terminé mi trabajo en 3 segundos. Convertí un archivo CSV de 120 MB a .db en solo 5 segundos.
zackygaurav
11

El comando sqlite3 .import no funcionará para datos csv ordinarios porque trata cualquier coma como un delimitador incluso en una cadena entre comillas.

Esto incluye intentar volver a importar un archivo csv creado por el 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 debemos transformar el csv en una lista de declaraciones Insert, o quizás funcione un delimitador diferente.

En SuperUser vi una sugerencia para usar LogParser para manejar archivos csv, voy a investigar eso.

blairxy
fuente
blairxy: El error que está recibiendo se debe a una coma en "¡Oye, tú!". Mientras carga la segunda línea, Sqlite ve 3 columnas y al eliminar la segunda coma puede cargarla sin errores.
Shiva
10

Si está contento de usar una secuencia de comandos (python), hay una secuencia de comandos de Python que automatiza esto en: https://github.com/rgrp/csv2sqlite

Esto creará automáticamente la tabla para usted, así como también hará algunas adivinaciones básicas de tipo y conversión de datos (por ejemplo, resolverá que algo es un número y establecerá el tipo de columna en "real").

Rufus Pollock
fuente
Casi funciona: la fila del encabezado se importa correctamente. Sin embargo, obtengo 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, nunca he visto ese error al usar esto. ¿Utilizaba datos que no eran unicode o utf8? Si es así, es posible que deba modificar el script para abrir el archivo CSV utilizando la codificación específica que está utilizando.
Rufus Pollock
Casi al mismo tiempo, escribí un guión ruby ​​que hace lo mismo. Incluso debería funcionar en varios archivos CSV a la vez, adivinando el nombre de la tabla a partir del nombre del archivo. github.com/dergachev/csv2sqlite
Dergachev
Necesitaríamos leer de sys.stdin ya que necesitamos convertir un archivo csv.gz de 60GB. ¿O habría una posibilidad de obtener soporte de lectura de gzip en csv2sqlite? ¡Gracias!
markusN
@markusN abre un problema en el rastreador de github. En general, me preocuparía por un archivo CSV de más de 100 GB en sqlite (¿ha pensado en un RDB "adecuado", por ejemplo, postgres o incluso bigquery, redshift, etc.?
Rufus Pollock
1

SQLite es extremadamente flexible ya que también permite los comandos de puntos específicos de SQLite en la sintaxis SQL (aunque son interpretados por CLI). Esto significa que puede hacer cosas como esta.

Crea una smstabla 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);

Luego dos archivos:

# 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 probar la importación del archivo CSV usando el archivo SQL, ejecute:

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

En conclusión, esto significa que puede usar la .importdeclaración en SQLite SQL, tal como puede hacerlo en cualquier otro RDB, como MySQL con LOAD DATA INFILEetc. Sin embargo, esto no se recomienda.

not2qubit
fuente
1

Consulte termsql. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Convierte texto a SQL en la línea de comandos. (CSV es solo texto)

Ejemplo:

cat textfile | termsql -o sqlite.db

De forma predeterminada, el delimitador es un espacio en blanco, por lo que para que funcione con CSV que usa comas, lo haría así:

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

alternativamente, puede hacer esto:

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

De forma predeterminada, generará los nombres de columna "COL0", "COL1", si desea que utilice la primera fila para los nombres de las columnas, haga lo siguiente:

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

Si desea establecer nombres de columna personalizados, haga esto:

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

si lo está usando en Windows, asegúrese de agregar la ruta a la base de datos en "" y también de usar doble barra \ en la ruta para asegurarse de que Windows lo entienda.

MahD
fuente
0

Así es como puede insertar en una columna de identidad:

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 es un archivo en C: \ code \ db \ predefined \

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

myfile.txt contiene cadenas separadas por un carácter de nueva línea.

Si desea agregar más columnas, es más fácil separarlas usando el carácter de barra vertical, que es el predeterminado.

vive el amor
fuente