2017-05-05 139 views
1

我正在開發在postgres中保存數據的應用程序。所以我必須在使用應用程序之前準備數據庫,必須創建幾個表。我通過運行SQL代碼創建此表,但我認爲這不是方便之後,我發現這個文檔:發佈postgresql擴展

一個有用的擴展到PostgreSQL通常包括多個SQL 對象;例如,新的數據類型將需要新的功能,新的 運算符以及可能的新索引運算符類。它有利於 收集所有這些對象在單個封裝中,以簡化數據庫 管理

使用的延伸,而不是僅僅運行 SQL腳本加載了一堆「寬鬆」的對象到數據庫的主要優點,是 PostgreSQL所就明白了擴展的對象 一起去

我認爲,我必須用這種方法

什麼,我不明白的是,我怎麼能分享我的分機ension。我認爲它像maven一樣工作,你可以用自定義的類型,函數,表格創建你的擴展,然後你可以打包它,命名它(例如my-ext-0.1),給版本和發行版本放入某種類型的存儲庫。之後,你可以連接到一個數據庫,運行SQL'創建擴展我的外部-0.1',並已做好一切:)

我認爲'創建擴展名'命令將下載擴展名並安裝它,而無需手動下載。我使用maven,常春藤和我期望從postgresql類似的行爲。

文檔說,您需要將您的擴展文件放在某個目錄下,而不是在某些數據庫下運行「創建擴展名」。

如何創建擴展並在不同服務器之間共享它們?

+0

請在閱讀https://www.postgresql.org/docs/current/static/extend.html之前,查看https://www.postgresql.org/docs/current/static/ plpgsql.html –

回答

2

Postgres擴展不能像這樣工作。他們可以訪問數據庫內部並可以運行任何代碼作爲數據庫操作系統用戶。因此,安裝它們通常僅限於超級用戶,從特定的目錄中進行安裝,並且只有其中一些託管服務器可用。

雖然你可以實現類似的功能,在添加到搜索路徑的特殊模式中安裝補充函數,類型和表格。那麼升級將是簡單:

drop schema mylib cascade; -- don't do this!!! 
create schema mylib; 
\i mylib.sql 

但不幸的是,這也將來自其他模式中刪除所有依賴對象 - 使用自定義類型,使用自定義功能,觸發等,所以它不是你的問題的解決方案列。

+0

創建腳本,單獨的模式,修改搜索路徑似乎是一種相當理智的方式。涉及表或數據的升級需要版本特定的升級腳本以保存數據。 – Glenn

2

我寧願使用可用的擴展和「標準」語言在我的模式中創建我的函數,類型和全部。

Postgres不會下載你的擴展(除非你創建擴展,將這個功能添加到postgres中)。但是你的擴展應該仍然是「通常」的方式。

檢查您的 「目錄擴展名」,運行:

t=# create extension "where should I put control file"; 
ERROR: could not open extension control file "/usr/local/share/postgresql/extension/where should I put control file.control": No such file or directory 

和重複的評論,extending SQL之前,請查看plpgsql現有的命令。

當您感到無聊並確保現有的postgres功能太有限時,請安裝postgres-contrib軟件包並檢查其他擴展程序,作爲最佳做法。當然,請檢查https://pgxn.org/