web-dev-qa-db-fra.com

Comment puis-je vider toutes les tables vers CSV pour un schéma PostgreSQL?

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.

10
robertpostill

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
3
Toilal