¿Cómo vuelco los datos, y solo los datos, no el esquema, de algunas tablas SQLite3 de una base de datos (no todas las tablas)? El volcado debe estar en formato SQL, ya que se debe volver a ingresar fácilmente en la base de datos más adelante y debe hacerse desde la línea de comandos. Algo como
sqlite3 db .dump
pero sin volcar el esquema y seleccionar qué tablas volcar.
Respuestas:
No estás diciendo lo que deseas hacer con el archivo volcado.
Usaría lo siguiente para obtener un archivo CSV, que puedo importar en casi todo
Si desea reinsertarse en una base de datos SQLite diferente, entonces:
fuente
Puede hacer esto obteniendo la diferencia de los comandos .schema y .dump. por ejemplo con grep:
data.sql
El archivo contendrá solo datos sin esquema, algo como esto:Espero que esto te ayude.
fuente
sqlite3 some.db < data.sql
sqlite3 storage/db/jobs.s3db .schema jobs > schema.sql
no funciona, peroecho '.schema' jobs | sqlite3 storage/db/jobs.s3db > schema.sql
funciona bien);
, y grep elimina todas las líneas que contienen);
Agregar la-x
opción a grep resuelve este problema.No es la mejor manera, pero al arrendamiento no necesita herramientas externas (excepto grep, que de todos modos es estándar en las cajas * nix)
pero necesita hacer este comando para cada tabla que está buscando.
Tenga en cuenta que esto no incluye el esquema.
fuente
sqlite3 Database.s3db .dump
grep -v '^CREATE'
como se sugiere en una de las otras respuestasgrep -v '^CREATE;
se interrumpirá si lasCREATE
declaraciones tienen saltos de línea (lo que a veces hacen). Lo mejor, IMO, es no eliminar automáticamente lasCREATE
declaraciones, sino editarlas manualmente. Simplemente use el editor de texto que necesite y busqueCREATE
y elimine manualmente esas declaraciones. Mientras la base de datos no sea enorme (y dado que está usando sqlite, supongo que es una nota), entonces esto es bastante simple.Puede especificar uno o más argumentos de tabla para el comando especial .dump, por ejemplo
sqlite3 db ".dump 'table1' 'table2'"
.fuente
sqlite3 3.31.1 (2020/01/27)
. El registro de cambios no dice nada al respecto. (Por cierto,--preserve-rowids
funciona pero no está documentado en absoluto.)Cualquier respuesta que sugiera usar grep para excluir las
CREATE
líneas o simplemente tomar lasINSERT
líneas de lasqlite3 $DB .dump
salida fallará gravemente. LosCREATE TABLE
comandos enumeran una columna por línea (por lo que excluirCREATE
no obtendrá todo), y los valores en lasINSERT
líneas pueden tener nuevas líneas incrustadas (por lo que no puede tomar solo lasINSERT
líneas).Probado en sqlite3 versión 3.6.20.
Si desea excluir ciertas tablas con las que puede filtrarlas
$(sqlite $DB .tables | grep -v -e one -e two -e three)
, o si desea obtener un subconjunto específico, reemplácelo conone two three
.fuente
Como una mejora a la respuesta de Paul Egan, esto se puede lograr de la siguiente manera:
--o--
La advertencia, por supuesto, es que tienes que tener grep instalado.
fuente
cat database.sql | grep '^INSERT' > database_inserts.sql
(lo mismo para el esquema, reemplace congrep '^CREATE'
grep '^INSERT' < database.sql > database_inserts.sql
quecat
es superfluocat
cuesta prácticamente nada para ejecutar y hace que la cadena de entrada como de salida mucho más clara. Por supuesto, también podría escribir,< database.sql grep '^INSERT' ...
pero una tubería explícita es mucho más fácil de leer.En Python o Java o en cualquier lenguaje de alto nivel, el .dump no funciona. Necesitamos codificar la conversión a CSV a mano. Doy un ejemplo de Python. Otros, se agradecerían ejemplos:
Si tiene "datos del panel", en otras palabras, muchas entradas individuales con ID agregan esto al aspecto y también vuelca las estadísticas de resumen:
fuente
De acuerdo con la documentación de SQLite para Command Line Shell Para SQLite , puede exportar una tabla de SQLite (o parte de una tabla) como CSV, simplemente configurando el "modo" a "csv" y luego ejecute una consulta para extraer las filas deseadas de la mesa:
Luego use el comando ".import" para importar datos CSV (valores separados por comas) en una tabla SQLite:
Lea la documentación adicional sobre los dos casos a considerar: (1) la tabla "tab1" no existe anteriormente y (2) la tabla "tab1" ya existe.
fuente
El mejor método sería tomar el código que haría el volcado sqlite3 db, excluyendo las partes del esquema.
Ejemplo de pseudocódigo:
Ver:
src/shell.c:838
(para sqlite-3.5.9) para el código realIncluso podría tomar ese caparazón y comentar las partes del esquema y usarlo.
fuente
Revisión de otras posibles soluciones.
Incluir solo INSERTOS
Fácil de implementar pero fallará si alguna de sus columnas incluye nuevas líneas
Modo de inserción de SQLite
Esta es una solución agradable y personalizable, pero no funciona si sus columnas tienen objetos blob como el tipo 'Geometry' en spaceialite
Difunde el basurero con el esquema
No estoy seguro de por qué, pero no funciona para mí.
Otra (nueva) posible solución
Probablemente no haya una mejor respuesta a esta pregunta, pero una que funciona para mí es grep las inserciones teniendo en cuenta que hay nuevas líneas en los valores de columna con una expresión como esta
Para seleccionar las tablas que se descartan, se
.dump
admite un argumento LIKE para que coincida con los nombres de las tablas, pero si esto no es suficiente, probablemente un script simple sea una mejor opcióno algo más elaborado para respetar las claves externas y encapsular todo el volcado en una sola transacción
Tenga en cuenta que la expresión grep fallará si
);
hay una cadena presente en cualquiera de las columnasPara restaurarlo (en una base de datos con las tablas ya creadas)
fuente
Esta versión funciona bien con líneas nuevas dentro de inserciones:
sqlite3 database.sqlite3 .dump | grep -v '^CREATE'
En la práctica, excluye todas las líneas que comienzan con
CREATE
menos probabilidades de contener nuevas líneas.fuente
La respuesta por retracile debería ser la más cercana, pero no funciona para mi caso. Una consulta de inserción simplemente se rompió en el medio y la exportación simplemente se detuvo. No estoy seguro de cuál es la razón. Sin embargo, funciona bien durante
.dump
.Finalmente escribí una herramienta para dividir el SQL generado a partir de
.dump
:https://github.com/motherapp/sqlite_sql_parser/
fuente
Puede hacer una selección en las tablas insertando comas después de cada campo para producir un csv, o usar una herramienta GUI para devolver todos los datos y guardarlos en un csv.
fuente