54

Postgres データベースでプロジェクトを実行しており、DB 内の列のコメントを取得して、テーブルの見出しなどとして使用する必要があります。いくつかの組み込み関数 ( pg_descriptionおよびcol_description ) があることを見てきましたが、それらの使用方法の例を見つけることができず、それらをいじっても無駄であることがわかりました。

それで、以前にこれを行うことができた人がいるかどうか疑問に思っていました。

4

15 に答える 15

61
SELECT c.table_schema,c.table_name,c.column_name,pgd.description
FROM pg_catalog.pg_statio_all_tables as st
  inner join pg_catalog.pg_description pgd on (pgd.objoid=st.relid)
  inner join information_schema.columns c on (pgd.objsubid=c.ordinal_position
    and  c.table_schema=st.schemaname and c.table_name=st.relname);
于 2011-02-09T14:38:59.977 に答える
18

それはすべてoidによって機能します。

mat=> SELECT c.oid FROM pg_catalog.pg_class c WHERE c.relname = 'customers';
  oid  
-------
 23208
(1 row)

これで、そのテーブルの oid が得られたので、次のように尋ねることができます。

mat=> select pg_catalog.obj_description(23208);
  obj_description  
-------------------
 Customers
(1 row)

次に、4 番目の列の説明を求めることができます。

mat=> select pg_catalog.col_description(23208,4);
             col_description             
-----------------------------------------
 Customer codes, CHS, FACTPOST, POWER...
(1 row)

またはを実行しpsqlたときにどのクエリが実行されるかを知りたい場合は、 で実行してください。\dt+\d+ customers-E

于 2008-12-05T07:51:14.123 に答える
14

スキーマに注意してください。このコードはそれらを考慮しています。

SELECT
    cols.column_name, (
        SELECT
            pg_catalog.col_description(c.oid, cols.ordinal_position::int)
        FROM
            pg_catalog.pg_class c
        WHERE
            c.oid = (SELECT ('"' || cols.table_name || '"')::regclass::oid)
            AND c.relname = cols.table_name
    ) AS column_comment
FROM
    information_schema.columns cols
WHERE
    cols.table_catalog    = 'your_database'
    AND cols.table_name   = 'your_table'
    AND cols.table_schema = 'your_schema';

参考文献:

于 2014-03-20T23:55:37.147 に答える
11

誰かがそれを必要とするなら、ここにいるだけです。

ここには多くの答えがありますが、どれも私が望むほど単純ではありませんでした. したがって、以前の回答と現在の postgres 9.4 に基づいて、次のクエリを作成しました。

SELECT 
    obj_description(format('%s.%s',isc.table_schema,isc.table_name)::regclass::oid, 'pg_class') as table_description,
    pg_catalog.col_description(format('%s.%s',isc.table_schema,isc.table_name)::regclass::oid,isc.ordinal_position) as column_description
FROM
    information_schema.columns isc

紛らわしい結合や醜い文字列の連結なしで、テーブルと列の説明をフェッチします。

于 2015-03-04T07:30:50.077 に答える
6

これは、PostBooks 3.2.2 DB を使用して機能します。

select cols.column_name,
(select pg_catalog.obj_description(oid) from pg_catalog.pg_class c where c.relname=cols.table_name) as table_comment
,(select pg_catalog.col_description(oid,cols.ordinal_position::int) from pg_catalog.pg_class c where c.relname=cols.table_name) as column_comment
from information_schema.columns cols
where cols.table_catalog='postbooks' and cols.table_name='apapply'

よろしく、 Sylnsr

于 2009-07-06T19:18:53.163 に答える
3

@Nick および @mat の提案の拡張:
SELECT obj_description('schemaName.tableName'::regclass, 'pg_class'); 文字列名 (oid ではない) がある場合に使用します。

「pg_class」パラメータを記憶することを避け、関数呼び出しで醜い連結を避けるために(tname||'.'||schema)::regclass、 の便利なオーバーロードとしてobj_description:

  CREATE FUNCTION obj_description(
      p_rname text, p_schema text DEFAULT NULL, 
      p_catalname text DEFAULT 'pg_class'
  ) RETURNS text AS $f$
     SELECT obj_description((CASE 
        WHEN strpos($1, '.')>0 OR $2 IS NULL OR $2='' THEN $1
        ELSE $2||'.'||$1
     END)::regclass, $3);
  $f$ LANGUAGE SQL IMMUTABLE;
 -- USAGE: obj_description('mytable') 
 --        SELECT obj_description('s.t'); 
 -- PS: obj_description('s.t', 'otherschema') is a syntax error, 
 --     but not generates exception: returns the same as ('s.t') 

テーブル名 (パラメーター)はvarcharであり、メインのテーブルやクエリと同様に、スキーマ名rnameの別のフィールドで表現できるため、使いやすくなりました。

「 PostgreSQL でテーブル コメントのリストを取得する」または新しい pg9.3 ガイドも参照してください。

于 2012-10-08T10:26:45.313 に答える
2

この答えは少し遅れていますが、私がこの問題を調査するために行ったグーグル検索でポップアップしました。テーブルの説明のみが必要でしたが、方法は列でも同じです。列の説明もpg_descriptionテーブルにあり、objoidによって参照されます。

このビューを追加します。


CREATE OR REPLACE VIEW our_tables AS 
 SELECT c.oid, n.nspname AS schemaname, c.relname AS tablename, d.description,
   pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS "tablespace", 
   c.relhasindex AS hasindexes, c.relhasrules AS hasrules, c.reltriggers > 0 AS hastriggers
   FROM pg_class c
   LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
   LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
   LEFT JOIN pg_description d ON c.oid = d.objoid
  WHERE c.relkind = 'r'::"char";

ALTER TABLE our_tables OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT, DELETE, REFERENCES, TRIGGER ON TABLE our_tables TO postgres;
GRANT SELECT ON TABLE our_tables TO public;

次に、以下を実行します。

SELECT tablename, description FROM our_tables WHERE schemaname = 'public'

このビューは、説明列に追加されたpg_tablesビューの修正バージョンです。ビュー定義をいじくり回して、単一のクエリにすることもできます。

于 2009-07-23T18:13:09.450 に答える
2

次のようなテーブル コメントにアクセスしました。

select c.relname table_name, pg_catalog.obj_description(c.oid) as comment from pg_catalog.pg_class c where c.relname = 'table_name';

したがって、列のコメントは次のとおりです。

SELECT c.column_name, pgd.description FROM pg_catalog.pg_statio_all_tables as st inner join pg_catalog.pg_description pgd on (pgd.objoid=st.relid) inner join information_schema.columns c on (pgd.objsubid=c.ordinal_position and c.table_schema=st.schemaname and c.table_name=st.relname and c.table_name = 'table_name' and c.table_schema = 'public');
于 2017-10-23T14:17:10.617 に答える
1

ここでこれを見つけました。1 つの特定のテーブルに関するすべての種類のメタデータ (型、デフォルト値、null 以外のフラグ、長さ、コメント、外部キー名、主キー名) を提供します。うまくいきそうです。

SELECT pg_tables.tablename, pg_attribute.attname AS field, 
    format_type(pg_attribute.atttypid, NULL) AS "type", 
    pg_attribute.atttypmod AS len,
    (SELECT col_description(pg_attribute.attrelid, 
            pg_attribute.attnum)) AS comment, 
    CASE pg_attribute.attnotnull 
        WHEN false THEN 1  ELSE 0  
    END AS "notnull", 
    pg_constraint.conname AS "key", pc2.conname AS ckey, 
    (SELECT pg_attrdef.adsrc FROM pg_attrdef 
        WHERE pg_attrdef.adrelid = pg_class.oid 
        AND pg_attrdef.adnum = pg_attribute.attnum) AS def 
FROM pg_tables, pg_class 
JOIN pg_attribute ON pg_class.oid = pg_attribute.attrelid 
    AND pg_attribute.attnum > 0 
LEFT JOIN pg_constraint ON pg_constraint.contype = 'p'::"char" 
    AND pg_constraint.conrelid = pg_class.oid AND
    (pg_attribute.attnum = ANY (pg_constraint.conkey)) 
LEFT JOIN pg_constraint AS pc2 ON pc2.contype = 'f'::"char" 
    AND pc2.conrelid = pg_class.oid 
    AND (pg_attribute.attnum = ANY (pc2.conkey)) 
WHERE pg_class.relname = pg_tables.tablename  
--    AND pg_tables.tableowner = "current_user"() 
    AND pg_attribute.atttypid <> 0::oid  
    AND tablename='your_table' 
ORDER BY field ASC

ソース: http://golden13.blogspot.de/2012/08/how-to-get-some-information-about_7.html

于 2015-09-22T13:09:26.800 に答える
0

先月、Postgresql のコメントについて同様の質問をしました。それを掘り下げると、コメントを抽出するプロセスを自動化する Perl コードが私のブログに出てくるでしょう。

テーブルの列名を引き出すには、次のようなものを使用できます。

select
     a.attname  as "colname"
    ,a.attrelid as "tableoid"
    ,a.attnum   as "columnoid"
from
    pg_catalog.pg_attribute a
    inner join pg_catalog.pg_class c on a.attrelid = c.oid
where
        c.relname = 'mytable' -- better to use a placeholder
    and a.attnum > 0
    and a.attisdropped is false
    and pg_catalog.pg_table_is_visible(c.oid)
order by a.attnum

次に、 tableoid,columnoid タプルを使用して、各列のコメントを抽出できます (私の質問を参照)。

于 2008-12-08T21:41:17.097 に答える
0

わかりましたので、ある程度解決しました...

col_description(テーブルID、列番号)を選択...

つまり、col_description(36698,2) を選択します。

それはうまくいきましたが、おそらくすべての列にすべてのコメントを持ってきて、oidの代わりにテーブル名を使用するより簡単な方法はありますか???

于 2008-12-05T07:45:21.360 に答える