升级postgis_sfcgal到3.1或更高
从PostGIS 3.1开始,PostGIS sfcgal库不再是postgis核心库的一部分,而是被拆分到一个新库postgis_sfcgal-3中。
对于使用ALTER EXTENSION postgis_sfcgal UPDATE 或**SELECT postgis_extensions_upgrade()**来说,而且是SFCGAL编译的PostGIS < 3.1升级到使用SFCGAL的PostGIS >= 3.1的人来说,这一变化不是问题。然而,如果你使用pg_upgrade,你可能会得到错误,比如postgis-3不包含函数postgis_sfcgal_version()(它是postgis_sfcgal扩展的一部分)。
造成这种中断的三个主要原因是:
-
我们希望postgis-3库具有相同的公开函数,无论你是否使用SFCGAL编译。这个改变是在PostGIS 3.0中计划的,但是只有后端 switching plumbing被移除,现在还没有完全分离。
-
这使得打包者有可能提供postgis_sfcgal(也许是作为一个单独的包),而不要求其他只想要postgis的用户必须拥有boost和CGAL。
-
在过去,postgis_sfcgal和postgis扩展在同一个底层库中被连接在一起,因为它们有一些名字相同的函数,如ST_3DIntersects和ST_Intersects。试图向人们解释这整个事情是如何运作的,如果他们想要扩展3D功能,就要把后端切换到sfcgal,更不用说在升级过程中,GUC后端的通知会带来更多的麻烦,这比它值得。因此,在未来,我们将不会在两个扩展之间重复使用函数名称,而只会有不重叠的函数名称。
选项一
在使用pg_upgrade升级PostGIS < 3.1 postgis_sfcgal时,最简单的解决方法是在运行pg_upgrade之前首先放弃postgis_sfcgal扩展。
因为postgis_sfcgal扩展只包含函数,不包含数据类型,所以这样做不会造成数据丢失。在你把它丢在旧集群中后,用在尝试pg_upgrade之前的旧集群中
-- 这一步只需要用于PostGIS < 3.1.0
DROP EXTENSION postgis_sfcgal;
如果你有视图、SQL函数或约束条件与postGIS绑定,上述DROP EXTENSION将会失败。SQL函数或约束条件与postgis_sfcgal函数绑定。在这种情况下,你可以在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。
原文标题:Upgrading postgis_sfcgal to 3.1 or higher
原文作者:Regina Obe
原文地址:https://postgis.net/2022/08/25/tip-upgrading-postgis-sfcgal/




