Postgres жалуется на то, что тип геометрии не существует во время запуска докера, а затем решает, что он существует позже - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь использовать столбец геометрии 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 для включения postgis.Нет жалоб, та же проблема.

Я могу только предположить следующее из журналов:

  1. Существует некоторая проблема порядка операций, где, несмотря на тот факт, что Postgis установлен,Я все еще не могу использовать столбец геометрии, потому что что-то еще должно завершиться первым.Что бы это ни было, оно завершается к тому времени, когда postgres принимает соединения.
  2. Функция проверяется только на синтаксис - тот факт, что код функции ссылается на тип геометрии в теле функции, не имеет значения, пока кто-то не вызовет ее.

Кто-нибудь еще видел это?Мы ожидаем, что все наши вещи будут собираться с использованием Docker и Jenkins.

1 Ответ

0 голосов
/ 22 мая 2019

Я разобрался в проблеме.Сценарий базы данных был изначально создан каким-то инструментом (я думаю, что это может быть pgdump), а затем были добавлены ручные изменения.Инструмент, который добавляет кучу операторов в начало скрипта, которые на самом деле не нужны.Одним из таких утверждений является следующее:

SELECT pg_catalog.set_config('search_path', '', false);

Я полагаю, этот параметр переопределяет "ALTER DATABASE to SET search_path".После того как я удалил это утверждение, скрипт работает нормально, и таблица создана.

...