web-dev-qa-db-ja.com

PostgreSQLスキーマのすべてのテーブルをCSVにダンプするにはどうすればよいですか?

多数のスキーマが含まれているデータベースがあり、各テーブルの内容をCSVにダンプしたい。 COPYコマンドは知っていますが、スキーマ内のすべてのテーブルを読み取るスクリプトを作成し、それらに対してCOPYを実行する方法がわかりません。

10
robertpostill

ここにあなたが望むことをすることができるシェルスクリプトがあります:

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

必ずDB変数とSCHEMA変数を特定のデータベースとスキーマに設定してください。

ラッピングpsqlコマンドは、Aおよびtフラグを使用して、cコマンドに渡された文字列からテーブルのリストを作成します。

すべてのスキーマをエクスポートする必要がある場合、スクリプトは次のとおりです

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