暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

升级postgis_sfcgal到3.1或更高

原创 花飞墨 2022-09-24
1300

升级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/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论