Postgresql
如何將函式保存到 PostgreSQL 中的單個文件?
我維護一個使用 PostgreSQL 數據庫的遺留應用程序。
該應用程序嚴重依賴於儲存過程(又名函式)。
我想將這些函式保存到以函式名稱命名的文件中,這樣我就可以使用 VCS(版本控制系統)。
我知道我可以
ALTER FUNCTION
使用 using保存程式碼,PgAdmin
但這只能讓我一次保存一個函式。我正在尋找一種自動保存所有功能的方法。有什麼方法可以編寫此任務的腳本嗎?
我使用 pg_get_functiondef 編寫了一個簡單的 PHP 腳本來獲取原始碼,然後將其保存到文件中。
$connection = pg_connect("connection string details"); $result = pg_query($connection, "select proname, pg_get_functiondef(oid) from pg_proc where pronamespace=<namespace_oid>"); while ($row = pg_fetch_row($result)) { $fp = fopen("{$row[0]}.sql", 'w'); fwrite($fp, $row[1]); }
執行以下
mkdir /tmp/foo
chown postgresql:postgresql /tmp/foo
然後,執行這個命令,我無恥地從克雷格關於 SO 的回答中
psql
竊取了它的內部工作原理,SELECT FORMAT( 'COPY (SELECT pg_get_functiondef(%s)) TO ''/tmp/foo/%s''', pp.oid, pp.proname ) from pg_proc pp inner join pg_namespace pn on (pp.pronamespace = pn.oid) inner join pg_language pl on (pp.prolang = pl.oid) where pl.lanname NOT IN ('c','internal') and pn.nspname NOT LIKE 'pg_%' and pn.nspname <> 'information_schema';
然後執行
\gexec