Comment puis-je vider les données, et uniquement les données, et non le schéma, de certaines tables SQLite3 d'une base de données (pas toutes les tables)? Le vidage doit être au format SQL, car il doit être facilement réintroduit dans la base de données ultérieurement et doit être effectué à partir de la ligne de commande. Quelque chose comme
sqlite3 db .dump
mais sans vider le schéma et sans sélectionner les tables à vider.
Réponses:
Vous ne dites pas ce que vous souhaitez faire avec le fichier vidé.
J'utiliserais ce qui suit pour obtenir un fichier CSV, que je peux importer dans presque tout
Si vous souhaitez réinsérer dans une autre base de données SQLite, alors:
la source
Vous pouvez faire cela en faisant la différence entre les commandes .schema et .dump. par exemple avec grep:
data.sql
Le fichier ne contiendra que des données sans schéma, quelque chose comme ceci:J'espère que ceci vous aide.
la source
sqlite3 some.db < data.sql
sqlite3 storage/db/jobs.s3db .schema jobs > schema.sql
ne fonctionne pas, maisecho '.schema' jobs | sqlite3 storage/db/jobs.s3db > schema.sql
fonctionne bien);
, et le grep supprime toutes les lignes contenant);
L'ajout de l'-x
option à grep résout ce problème.Pas le meilleur moyen, mais au bail n'a pas besoin d'outils externes (sauf grep, qui est de toute façon standard sur les boîtiers * nix)
mais vous devez exécuter cette commande pour chaque table que vous recherchez.
Notez que cela n'inclut pas le schéma.
la source
sqlite3 Database.s3db .dump
grep -v '^CREATE'
comme suggéré dans l'une des autres réponsesgrep -v '^CREATE;
va casser si lesCREATE
instructions ont des sauts de ligne en eux (ce qu'ils font parfois). Le mieux, l'OMI, n'est pas du tout de supprimer automatiquement lesCREATE
déclarations, mais de les éditer manuellement. Utilisez simplement l'éditeur de texte dont vous avez besoin, recherchezCREATE
et supprimez manuellement ces instructions. Tant que la base de données n'est pas énorme (et que vous utilisez sqlite, je suppose que c'est noté), alors c'est assez simple.Vous pouvez spécifier un ou plusieurs arguments de table dans la commande spéciale .dump, par exemple
sqlite3 db ".dump 'table1' 'table2'"
.la source
sqlite3 3.31.1 (2020/01/27)
. Le journal des modifications ne dit rien à ce sujet. (À propos,--preserve-rowids
fonctionne mais n'est pas du tout documenté.)Toute réponse suggérant d'utiliser grep pour exclure les
CREATE
lignes ou simplement récupérer lesINSERT
lignes de lasqlite3 $DB .dump
sortie échouera mal. LesCREATE TABLE
commandes listent une colonne par ligne (donc exclureCREATE
ne l'obtiendra pas entièrement), et les valeurs sur lesINSERT
lignes peuvent avoir des retours à la ligne intégrés (vous ne pouvez donc pas saisir uniquement lesINSERT
lignes).Testé sur sqlite3 version 3.6.20.
Si vous souhaitez exclure certaines tables, vous pouvez les filtrer avec
$(sqlite $DB .tables | grep -v -e one -e two -e three)
, ou si vous souhaitez obtenir un sous-ensemble spécifique, remplacez-le parone two three
.la source
Pour améliorer la réponse de Paul Egan, ceci peut être accompli comme suit:
--ou--
La mise en garde, bien sûr, est que vous devez avoir installé grep.
la source
cat database.sql | grep '^INSERT' > database_inserts.sql
(même chose pour le schéma, remplacez pargrep '^CREATE'
grep '^INSERT' < database.sql > database_inserts.sql
quecat
c'est superflucat
exécution ne coûte pratiquement rien et rend la chaîne d'entrée-sortie beaucoup plus claire. Bien sûr, vous pouvez également écrire< database.sql grep '^INSERT' ...
mais un tube explicite est beaucoup plus facile à lire.En Python ou Java ou dans tout autre langage de haut niveau, le .dump ne fonctionne pas. Nous devons coder la conversion en CSV à la main. Je donne un exemple Python. D'autres, des exemples seraient appréciés:
Si vous avez des données de panneau, en d'autres termes, de nombreuses entrées individuelles avec des identifiants ajoutent ceci à avec look et il vide également les statistiques récapitulatives:
la source
Selon la documentation SQLite pour le shell de ligne de commande pour SQLite, vous pouvez exporter une table SQLite (ou une partie d'une table) au format CSV, simplement en définissant le "mode" sur "csv", puis exécutez une requête pour extraire les lignes souhaitées de la table:
Ensuite, utilisez la commande ".import" pour importer des données CSV (valeurs séparées par des virgules) dans une table SQLite:
Veuillez lire la documentation supplémentaire sur les deux cas à considérer: (1) La table "tab1" n'existe pas auparavant et (2) la table "tab1" existe déjà.
la source
La meilleure méthode serait de prendre le code que le db dump sqlite3 ferait, à l'exclusion des parties de schéma.
Exemple de pseudo code:
Voir:
src/shell.c:838
(pour sqlite-3.5.9) pour le code réelVous pouvez même simplement prendre ce shell et commenter les parties du schéma et l'utiliser.
la source
Examen des autres solutions possibles
Inclure uniquement les INSERTs
Facile à mettre en œuvre mais échouera si l'une de vos colonnes inclut de nouvelles lignes
Mode d'insertion SQLite
C'est une solution agréable et personnalisable, mais cela ne fonctionne pas si vos colonnes ont des objets blob comme le type 'Geometry' dans spatialite
Différer le vidage avec le schéma
Je ne sais pas pourquoi, mais ne fonctionne pas pour moi
Une autre (nouvelle) solution possible
Il n'y a probablement pas de meilleure réponse à cette question, mais celle qui fonctionne pour moi est de grep les insertions en tenant compte du fait qu'il y a de nouvelles lignes dans les valeurs de colonne avec une expression comme celle-ci
Pour sélectionner les tables à vider,
.dump
admet un argument LIKE pour correspondre aux noms de table, mais si cela ne suffit pas, un simple script est probablement la meilleure optionou quelque chose de plus élaboré pour respecter les clés étrangères et encapsuler tout le vidage en une seule transaction
Tenez compte du fait que l'expression grep échouera si
);
une chaîne est présente dans l'une des colonnesPour le restaurer (dans une base de données avec les tables déjà créées)
la source
Cette version fonctionne bien avec les nouvelles lignes à l'intérieur des inserts:
sqlite3 database.sqlite3 .dump | grep -v '^CREATE'
En pratique, exclut toutes les lignes commençant par
CREATE
lesquelles sont moins susceptibles de contenir des nouvelles lignesla source
La réponse par retracile devrait être la plus proche, mais cela ne fonctionne pas pour mon cas. Une requête d'insertion s'est interrompue au milieu et l'exportation s'est arrêtée. Je ne sais pas quelle est la raison. Cependant, cela fonctionne bien pendant
.dump
.Enfin, j'ai écrit un outil pour diviser le SQL généré à partir de
.dump
:https://github.com/motherapp/sqlite_sql_parser/
la source
Vous pouvez faire une sélection sur les tables en insérant des virgules après chaque champ pour produire un csv, ou utiliser un outil GUI pour renvoyer toutes les données et les enregistrer dans un csv.
la source