🐘
PostgreSQLで既存のテーブルからCREATE TABLEコマンドを出力する
結論
以下のコマンドで出力できる
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
で別途出力されるので、そちらも取得するようにした
- ただし、pkなどの定義は
解説
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