從 PostGIS 3.0 開始,對於柵格數據的支持就從 postgis
擴展中分離了,叫做 postgis_raster
.
主要有兩個原因:
- PostGIS 插件的柵格功能很多,有超過 150 多個函數和多個數據類型,對於沒用到這些的用戶可能會有些迷茫;
- gdal 庫的佔體積很大,很多隻用
postgis
擴展的開發者希望減少它
雖然分離出柵格的部分讓一部分開發者滿意了,但是意味着從 2.x 升級到 3.x 的 PostGIS 就變得有點麻煩了,即使是有經驗的用戶也有可能搞砸。
本文將介紹 PostGIS 柵格模塊升級的正確方法,即升級 2.x 的 PostGIS 到 3.x.
你可以用 psql 或 pgAdmin 或者任意一種 PostgreSQL 工具來運行下面的步驟。
無論你現在是什麼版本的 PostGIS,你都應該先把 3.x 的 PostGIS 插件安裝了,也無論你怎麼安裝的。
如果你是 2.4 或以下版本的
-- 這一步僅版本< 2.5.4
alter extension postgis update;
-- 其它 2.x 的都要做如下步驟:注意,要運行兩次
select postgis_extensions_upgrade();
select postgis_extensions_upgrade();
隨後,若你的數據庫沒有用到柵格相關的功能,沒有包含柵格數據的表,那麼可以用下面的語句刪除柵格擴展:
drop extension postgis_raster;
你可能想問,爲什麼 select postgis_extensions_upgrade();
這一條語句要跑兩次,原因是跑第一條會將柵格部分從 postgis
擴展中分離出來,分離出函數和類型;跑第二條時,就能把這些函數和類型重新綁定至 postgis_raster
擴展中。
很遺憾,官方沒能通過單個 pg 函數完成這一個過程,因爲官方的作者忘記了具體是爲什麼就沒寫,貌似是因爲 PostgreSQL 的擴展升級、安裝以及創建一個新的擴展這些操作不能在同一個事務中進行。
PostgreSQL 13 移除了 create extension ... from unpackaged
的支持,增加了一些複雜性。因此,升級 13 或者更高版本的 PostgreSQL 之前最好就升級 PostGIS 3.x.