Postgres抱怨在docker启动期间不存在几何类型,然后决定以后存在

时间:2019-05-17 20:11:42

标签: postgresql docker postgis

我正在尝试将Docker构建中使用PostGIS几何列。 当docker启动容器时,我得到以下日志(为简明起见缩写):

Loading PostGIS extensions into template_postgis
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
Loading PostGIS extensions into postgres
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/script.sql

其中script.sql包含以下内容:

CREATE TABLE public.spatial_data_wfs (
  id int4 NOT NULL,
  name varchar(255) NOT NULL,
  featureid varchar(255) NOT NULL,
  geofeature jsonb NOT NULL,
  coordinates geometry NOT NULL
);

尽管在脚本之前加载了PostGIS扩展,但会出现以下错误:

psql:/docker-entrypoint-initdb.d/script.sql:238: ERROR:  type "geometry" does not exist
LINE 6:  coordinates geometry NOT NULL,

如果我删除几何列并等待容器启动,则可以使用alter table语句添加几何列,它会正常工作。

该脚本还定义了一个生成多边形的函数,这不会造成任何问题。我已经根据其他SO问题尝试了以下方法:

  1. 创建postgis扩展名:抱怨已经创建了。
  2. 使用ALTER DATABASE设置search_path以包含邮政编码。没有抱怨,同样的问题。

我只能从日志中假设以下内容:

  1. 存在一些操作顺序问题,尽管已安装了postgis,但我仍然不能使用geometry列,因为必须先完成其他操作。不管是什么,它都将在postgres接受连接时完成。
  2. 仅对函数进行语法验证-函数代码引用函数主体中的几何类型的事实并不重要,直到有人调用它为止。

还有其他人看到吗?我们希望所有东西都可以使用Docker和Jenkins构建。

1 个答案:

答案 0 :(得分:0)

我发现了问题所在。数据库脚本最初是由某些工具(我认为可能是pgdump)创建的,然后添加了手动更改。该工具在脚本的开头添加了很多不必要的语句。这些语句之一如下:

runtime

我猜想此设置将覆盖“将ALTER DATABASE设置为SET search_path”。删除该语句后,脚本可以正常工作,并创建了表。