🐘

PostgreSQLで既存のテーブルからCREATE TABLEコマンドを出力する

2024/08/26に公開

結論

以下のコマンドで出力できる

pg_dump -h ${hostname} -p ${port} -U ${username} -d ${dbname} -t ${table} -s | grep -Poza 'CREATE TABLE[\s\S]*?\);|ALTER TABLE ONLY[\s\S]*?;'

経緯

  • 現在のテーブル定義からCREATE TABLEコマンドを逆引きしたかった
  • pg_dumpの出力には余計なものも含まれているので、CREATE TABLE部分を抽出した
    • ただし、pkなどの定義はALTER TABLE ONLYで別途出力されるので、そちらも取得するようにした

解説

pg_dumpオプション

Option Description Memo
-t ${table} 取得対象テーブルを指定する。 --table=
ワイルドカード検索可(ex. hoge_*で'hoge_dogs'も'hoge_cats'も)
複数テーブル指定可(ex. -t tableA -t tableB)
-s データはダンプしない。 --schema-only
  • 接続用オプションは省略

grepオプション

Option Description Memo
-P Perl風正規表現を使用する --perl-regexp
[\s\S](空白文字と非空白文字)を使用するため
-o マッチした部分だけを表示 --only-matching
-z 改行をヌル文字に変換 --null-data
改行を跨いでヒットするようになる
-a テキストとして読み込ませる --text
-zオプションを使うと入力がバイナリファイルと誤認される場合があったため

Discussion