LoginSignup
4
1

More than 5 years have passed since last update.

PosgreSQLから 関数を 名前を指定して 関数毎に 別ファイルに エクスポートする

Posted at

前段

PoostgreSQL 10.6 (on docker)で確認しています。
必要に迫られてDBからストアドファンクションのコードを取り出すことに。

pg_dumpで一括確保!も考えたのですが、関数毎にファイルが分かれないのでダンプファイルを解析する必要があり、それはとてもとても面倒なのでやめました。

本題

  • 対象の関数名を取得する

ぐぐってヒットした記事

ユーザ定義関数情報の参照
http://yanor.net/wiki/?PostgreSQL/%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3/%E3%83%A6%E3%83%BC%E3%82%B6%E5%AE%9A%E7%BE%A9%E9%96%A2%E6%95%B0%E6%83%85%E5%A0%B1%E3%81%AE%E5%8F%82%E7%85%A7

も試してみたのですが、どうもpostgreSQL由来の関数も大量にヒットしてしまうため、やめました。
結局原始的にpg_dumpで出力したダンプファイルを..

grep "CREATE FUNCTION" ./[ダンプファイル名].dump

という力技で解決。
シンプルが一番。

関数名さえとれればこっちのもの。

PostgreSQL の psql で関数のソースコードを取得する
http://everything-you-do-is-practice.blogspot.com/2017/09/postgresql-psql.html

こちらの方法に従ってソースコードを取り出せます。
ただ、これだとヘッダにpsqlの余計な出力、各行の末尾にも余計なスペースと+がついてしまうので、sedで加工します。

sed -i -e "s/ *+$//" ./[エクスポートした関数].sql

これでそのままCREATEできるSQLができました。

以上の手順をまとめたスクリプトがこちら

#!/bin/bash
# export stored functions from database.
set -e

DB_HOST=[適切なホスト名]
DB_USER=[適切なユーザー名]
DB_NAME=[適切なDB名]

DB_CON="psql -t -h ${DB_HOST} -U ${DB_USER} ${DB_NAME}"

FUNCTIONS="\
    function_name_1 \
    function_name_2 \
"

for f in $FUNCTIONS
do
    echo $f;
    QUERY="SELECT pg_get_functiondef((SELECT oid FROM pg_proc WHERE proname = '${f}'));";
    echo $QUERY | $DB_CON > "${f}.sql"

    sed -i -e "s/ *+$//" ${f}.sql
done

ご参考まで。

4
1
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
4
1