219 votes

Comment puis-je vider les données de certaines tables SQLite3 ?

Comment puis-je vider les données, et seulement les données, pas 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 sélectionner les tables à vider.

239voto

CyberFonic Points 2218

Vous ne dites pas ce que vous souhaitez faire avec le fichier vidé.

Pour obtenir un fichier CSV (qui peut être importé dans presque tout)

.mode csv 
-- use '.separator SOME_STRING' for something other than a comma.
.headers on 
.out file.csv 
select * from MyTable;

Pour obtenir un fichier SQL (qui peut être réinséré dans une autre base de données SQLite)

.mode insert <target_table_name>
.out file.sql 
select * from MyTable;

195voto

jellyfish Points 98

Vous pouvez faire cela en obtenant la différence des commandes .schema et .dump. par exemple avec grep :

sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -vx -f schema.sql dump.sql > data.sql

data.sql ne contiendra que des données sans schéma, quelque chose comme ceci :

BEGIN TRANSACTION;
INSERT INTO "table1" VALUES ...;
...
INSERT INTO "table2" VALUES ...;
...
COMMIT;

J'espère que cela vous aidera.

44voto

Paul Egan Points 161

Vous pouvez spécifier un ou plusieurs arguments de table à la commande spéciale .dump, par ex. sqlite3 db ".dump 'table1' 'table2'" .

38voto

polyglot Points 3627

Ce n'est pas la meilleure méthode, mais au moins elle ne nécessite pas d'outils externes (sauf grep, qui est standard sur les machines *nix de toute façon).

sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'

mais vous devez effectuer cette commande pour chaque table que vous recherchez.

Notez que cela n'inclut pas le schéma.

10voto

Drew Points 993

Pour améliorer la réponse de Paul Egan, on peut procéder comme suit :

sqlite3 database.db3 '.dump "table1" "table2"' | grep '^INSERT'

--ou

sqlite3 database.db3 '.dump "table1" "table2"' | grep -v '^CREATE'

Le problème, bien sûr, est que vous devez avoir grep installé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X