J'ai une base de données avec beaucoup de schémas et je veux vider le contenu de chaque table vers CSV. Je connais la commande COPY mais je ne sais pas comment écrire quelque chose qui lira toutes les tables dans un schéma et exécutera la copie contre elles.
Voici un script Shell qui peut faire ce que vous voulez:
SCHEMA="myschema"
DB="mydb"
psql -Atc "select tablename from pg_tables where schemaname='$SCHEMA'" $DB |\
while read TBL; do
psql -c "COPY $SCHEMA.$TBL TO STDOUT WITH CSV" $DB > $TBL.csv
done
Assurez-vous de définir les variables DB et SCHEMA sur votre base de données et votre schéma particuliers.
La commande wrapping psql utilise les indicateurs A et t pour créer une liste de tables à partir de la chaîne transmise à la commande c.
Si vous devez exporter tous les schémas, voici le script
PGDATABASE="db"
PGUSER="user"
psql -Atc "select schema_name from information_schema.schemata" |\
while read SCHEMA; do
if [[ "$SCHEMA" != "pg_catalog" && "$SCHEMA" != "information_schema" ]]; then
psql -Atc "select tablename from pg_tables where schemaname='$SCHEMA'" |\
while read TBL; do
psql -c "COPY $SCHEMA.$TBL TO STDOUT WITH CSV DELIMITER ';' HEADER ENCODING 'UTF-8'" > $SCHEMA.$TBL.csv
done
fi
done