9
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PostgreSQLのテーブル定義の一覧を頑張って取得してみた

Last updated at Posted at 2013-06-19

はじめましての方ははじめまして。
そうでない方はまずいないと思いますのではじめまして。

psqlのデータ量が多くなってくると、たまに全体がどういった構成になっているか確認したくなることはないでしょうか。
しかも、いちいち各テーブルで\dするのが面倒なくらいの量だったら。
select tablename,attname from pg_stats;とやれば、テーブル名とカラム名の一覧は作れます。
でも、型とか、説明とか、そういう情報も欲しいですよね。
そういう便利なビューは検索しても見当たりませんでした。

ならば作るしかないでしょう。

WITH res AS (
    SELECT c.oid
         , NULL AS tablename
         , a.attnum AS no
         , a.attname AS col
         , CASE WHEN a.atttypmod > 0 THEN t.typname || '(' || (a.atttypmod-4) || ')' ELSE t.typname END AS type
         , CASE WHEN a.attnotnull THEN 'not null' ELSE '' END AS cannull
         , d.description
    FROM pg_class c
    JOIN pg_namespace n ON c.relnamespace = n.oid
    JOIN pg_attribute a ON c.oid = a.attrelid
    JOIN pg_type t ON a.atttypid = t.oid
    LEFT JOIN pg_description d ON c.oid = d.objoid
                                  AND a.attnum = d.objsubid
    WHERE n.nspname = 'public'
      AND a.attstattarget = -1
      AND pg_get_userbyid(c.relowner) = 'hiwasa'
    UNION
        SELECT c.oid
             , c.relname AS tablename
             , 0 AS no
             , CASE WHEN c.relkind = 'r' THEN '  テーブル'
                    WHEN c.relkind = 'v' THEN '  ビュー'
                    WHEN c.relkind = 'S' THEN '  シーケンス'
                    WHEN c.relkind = 'i' THEN '  インデックス'
                    ELSE '  ' || c.relkind
               END AS col
             , NULL AS type
             , NULL AS cannull
             , d.description
          FROM pg_class c
          JOIN pg_namespace n ON c.relnamespace = n.oid
          LEFT JOIN pg_description d ON c.oid = d.objoid
                                        AND d.objsubid = 0
         WHERE n.nspname = 'public'
           AND pg_get_userbyid(c.relowner) = 'hiwasa'
    ORDER BY oid, no
)
SELECT tablename
     , col AS column
     , type
     , cannull AS "null制約" 
     , description AS "説明" 
  FROM res
  ;

pg_stats の定義などを参考に作成してみました。
これで、テーブル名とカラム名、説明、null制約までは取得できます。
デフォルト値などの情報はないですけど、これくらいでも十分テーブル構成は把握できるんじゃないかと思います。

9
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?