將 postgis_sfcgal 升級到 3.1 或更高版本
自 PostGIS 3.1 起,PostGIS sfcgal 支援函式庫已不再是 postgis 核心函式庫的一部分,而是轉移到新的函式庫 postgis_sfcgal-3 中。
對於使用 SFCGAL 從 PostGIS < 3.1 編譯進行一般升級或系統升級到具有 SFCGAL 的 PostGIS >= 3.1 的人員來說,這個變更並無影響,且可以使用 ALTER EXTENSION postgis_sfcgal UPDATE; 或 SELECT postgis_extensions_upgrade();。不過,如果您使用 pg_upgrade,您可能會收到錯誤訊息,例如 postgis-3 不包含函數 postgis_sfcgal_version()(它屬於 postgis_sfcgal 延伸模組)。
這個中斷的主要原因有三個:
-
我們希望 postgis-3 函式庫具備相同的顯式函數,無論您是否使用 SFCGAL 編譯。這個變更已在 PostGIS 3.0 中規劃,但只有後端切換管線被移除,而非完整中斷。
-
這可以使套件管理員提供 postgis_sfcgal(也許作為一個獨立套件),而不需要其他只想要 postgis 的使用者具備 boost 和 CGAL。
-
過去,
postgis_sfcgal
和postgis
延伸套件連結於同一個基礎函式庫中,因為它們有一些功能的命名重疊,例如ST_3DIntersects
和ST_Intersects
。試著向人們解釋如何運作這些功能,讓後端切換到 sfcgal,如果他們想要擴充 3D 功能,更不用提一個在升級過程中增加一些惱人公告的 GUC 後端。因此,在未來,我們不會在兩個延伸套件間重複使用功能名稱,且函式名稱不會重疊。
使用 pg_upgrade
升級 PostGIS < 3.1 postgis_sfcgal
時最簡單的修復方法是在執行 pg_upgrade
之前先捨棄 postgis_sfcgal
延伸套件。
這可以在不遺失資料的情況下執行,因為 postgis_sfcgal
延伸套件僅含有功能,不包含資料類型。在舊叢集中捨棄該延伸套件之後,使用下列指令:
在嘗試 pg_upgrade
之前,在舊叢集中
-- this step only needed for PostGIS < 3.1.0
DROP EXTENSION postgis_sfcgal;
如果你有檢視、SQL 函式或受約束於 postgis_sfcgal
函式的約束,上述的 DROP EXTENSION
將會失敗。在這種情況下,你可以在 pg_upgrade
執行之前放棄那些相依性,並確定你有程式碼可以重新建立。或者,你可以執行「選項 2」。
在舊叢集中捨棄延伸套件後,你可以執行 pg_upgrade
。
在 pg_upgrade
之後,接著在新叢集中重新加入延伸套件。
CREATE EXTENSION postgis_sfcgal;
如果你未在與 postgis
延伸套件相同的結構中安裝,建立延伸套件將發生錯誤。如果您收到錯誤,請明確指定您在其中安裝 postgis 的結構
CREATE EXTENSION postgis_sfcgal SCHEMA postgis;
在舊叢集中,確認你已安裝 3.1 以上版本的 postgis 二進位檔,然後執行下列指令:
ALTER EXTENSION postgis UPDATE;
SELECT postgis_extensions_upgrade();
接著照常執行 pg_upgrade
。