ときたま、既存のPostgreSQL環境でテーブルやビューの作成時のSQLを確認することがある。 MySQLとかだと「SHOW CREATE ~」で確認できるのだけど、PostgreSQLでテーブル定義文を確認する場合はSQLからは確認ができず、pg_dumpでバックアップデータを取得してCREATE TABLEを抽出することで対応する。

pg_dump DB名 -s -t テーブル名 | awk '/^CREATE TABLE/,/^)/'
-bash-4.2$ pg_dump test_db -s -t test_table --schema-only | awk '/^CREATE TABLE/,/^)/'
CREATE TABLE test_table (
    id integer NOT NULL,
    name character varying(50)
);

ビューの場合も、同様の方法で求める事ができる。

-bash-4.2$ pg_dump test_db -s -t test_v | awk '/^CREATE VIEW/,/;$/'
CREATE VIEW test_v AS
    SELECT test1.id FROM test1;

単にカラムとかの定義を確認するだけなら、psqlで以下のようにコマンドを実行すれば確認が可能だ。

\d+ テーブル名(ビュー名)
test_db=# \d+ test_table
                                               テーブル "public.test_table"
  列  |          型           |                         修飾語                          | ストレージ | 対象統計情報 | 説明
------+-----------------------+---------------------------------------------------------+------------+--------------+------
 id   | integer               | not null default nextval('test_table_id_seq'::regclass) | plain      |              |
 name | character varying(50) |                                                         | extended   |              |
インデックス:
    "test_table_pkey" PRIMARY KEY, btree (id)
OID を持つ: no

test_db=# \d+ test_v
          ビュー "public.test_v"
 列 |   型    | 修飾語 | ストレージ | 説明
----+---------+--------+------------+------
 id | integer |        | plain      |
ビュー定義:
 SELECT test1.id
   FROM test1;