web-dev-qa-db-ja.com

SQLクエリを使用してPostgresqlの関数、シーケンス、タイプなどの定義を取得する

PostgreSQLデータベースオブジェクトの作成スクリプトが必要です。

Pg_dumpにアクセスできません。したがって、SQLクエリですべてを取得する必要があります。どうすればこれができますか?

20
John

関数の定義を取得するには、pg_get_functiondef()を使用します。

select pg_get_functiondef(oid)
from pg_proc
where proname = 'foo';

インデックス、ビュー、ルールなどの定義を取得するための同様の関数があります。詳細については、マニュアルを参照してください: http://www.postgresql.org/docs/current/static/functions-info.html

ユーザータイプの定義を取得するのは少し難しいです。そのためには、information_schema.attributesをクエリする必要があります。

select attribute_name, data_type
from information_schema.attributes
where udt_schema = 'public'
  and udt_name = 'footype'
order by ordinal_postion;

それから、create typeステートメントを再アセンブルする必要があります。

詳細については、システムカタログのドキュメントを読む必要があります。 http://www.postgresql.org/docs/current/static/catalogs.html

ただし、同じ情報が返される場合は、information_schemaビューを優先する必要があります。

35

psql -E は、これらのクエリのクエストに役立ちます。
バックスラッシュコマンドの実行時にpsqlが使用するクエリを表示します-この関数の詳細については、\df+ myfuncのように。

12

次に、pg_get_functiondefを使用した完全なサンプルクエリを示します。

WITH funcs AS (
  SELECT
    n.nspname AS schema
    ,proname AS sproc_name
    ,proargnames AS arg_names
    ,t.typname AS return_type
    ,d.description
    ,pg_get_functiondef(p.oid) as definition
  FROM pg_proc p
    JOIN pg_type t on p.prorettype = t.oid
    JOIN pg_description d on p.oid = d.objoid
    JOIN pg_namespace n on n.oid = p.pronamespace
  WHERE n.nspname = 'some_schema_name_here'
)
SELECT *
FROM funcs
;;

明らかに、スキーマ名を指定する必要があります(または、そのスキーマを使用している場合は「public」)

3
MikeM