J'utilise le client Postico qui me permet d'écrire des requêtes SQL pour ma base de données Postgres. Je n'ai pas accès au terminal.
Pendant le développement, je dois fréquemment effacer toutes les données, ce qui prend du temps. Y a-t-il une commande qui peut faire cela?
J'ai essayé ceci mais j'obtiens une erreur de syntaxe:
SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE';
J'ai également essayé DELETE FROM tbl;
et TRUNCATE TABLE;
MISE À JOUR: Si j'exécute cette commande:
DELETE FROM * WHERE *
Ensuite, j'ai environ 30 tables, donc devoir exécuter une commande 30 fois prend encore beaucoup de temps.
3 Réponses :
La syntaxe est incorrecte. Vous devrez exécuter:
TRUNCATE tablename;
La troncature est plus rapide car elle supprime immédiatement toutes les données de la table. La syntaxe pour cela est:
DELETE FROM tablename WHERE columnname = 'value';
J'ai mis à jour ma question. J'ai environ 30 tables, donc avoir à la commande 30 fois prendra beaucoup de temps. Y a-t-il une seule commande qui fonctionnerait?
Il n'y a pas de commande unique pour cela, vous devrez écrire un script qui TRUNCATE
toutes les tables dans le bon ordre (et n'oubliez pas de réinitialiser les séquences).
Une alternative est de créer un tel script avec pg_dump
:
pg_dump -s --clean -f script.sql dbname
Ce script supprimera et recréera tous les objets.
Vous pouvez générer une seule instruction TRUNCATE:
do $$ declare l_sql text; begin SELECT 'truncate table ' ||string_agg(format('%I.%I', table_schema, table_name), ',') ||' cascade restart identity' into l_sql FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE'; execute l_sql; end; $$ ;
Ensuite, copiez et collez simplement l'instruction générée pour l'exécuter.
Vous pouvez également utiliser un bloc DO qui utilise du SQL dynamique pour exécuter l'instruction TRUNCATE:
SELECT 'truncate table '|| string_agg(format('%I.%I', table_schema, table_name), ',')|| ' cascade restart identity;' FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE';
En tronquant toutes les tables en une seule instruction, vous n'avez pas à vous soucier de l'ordre de les tronquer.
Notez que si vous avez de nombreuses tables, vous devrez peut-être augmenter max_locks_per_transaction
pour que cela fonctionne.