Liquibase для создания таблицы с типом Postgis «Геометрия»

#java #spring #postgresql #postgis #liquibase

Вопрос:

Я пишу сценарий liquibase для создания таблицы со Geometry столбцом (из расширения PostGIS базы данных PostgreSQL)

Однако мне не удалось заставить его работать. Мой сценарий:

   - changeSet:
      id: 5-change-set-places
      comment: Create places table
      author: LongLe
      validCheckSum: 1:any
      changes:
        - sql:
            dbms: postgresql
            endDelimiter: ;
            splitStatements: true
            sql: |
              CREATE TABLE IF NOT EXISTS "${schema}"."places" (
                "id" bigint NOT NULL,
                "geom" GEOMETRY(Geometry, 4326) NOT NULL
              );
              GRANT SELECT, INSERT, UPDATE, DELETE ON "${schema}"."places" TO "${rolename}";
              ALTER TABLE "${schema}"."places"
                DROP CONSTRAINT IF EXISTS "places_pkey",
                ADD CONSTRAINT "places_pkey" PRIMARY KEY ("id");
 

Однако это не удалось с ошибкой ниже:

 ERROR: type "geometry" does not exist
 

Я также упомянул о пространственном расширении ликвидной базы https://github.com/lonnyj/liquibase-spatial и составьте эквивалентную конфигурацию:

   - changeSet:
      id: 5-change-set-places
      comment: Create places table
      author: LongLe
      validCheckSum: 1:any
      changes:
        - createTable:
            columns:
              - column:
                  constraints:
                    nullable: false
                    primaryKey: true
                    primaryKeyName: places_pkey
                  name: id
                  type: bigint
              - column:
                  constraints:
                    nullable: false
                  name: geom
                  type: GEOMETRY(Geometry,4326)
            tableName: test
 

Но он все равно потерпел неудачу с ошибкой:

31-03-2021 21:07:31.587 [основной] ПРЕДУПРЕЖДАЕТ c.m.ms.блок…applyLiquibase — Ошибка при применении liquibase попытка 5 : Миграция не удалась для пути к классу набора изменений:db/журнал изменений/db.журнал изменений-master.yaml::5-изменение-набор-мест::LongLe: Причина: liquibase.исключение.Исключение базы данных: ОШИБКА: тип «геометрия» не существует Позиция: 67 [Сбой SQL: СОЗДАНИЕ ТАБЛИЦЫ testschema.places (идентификатор BIGINT НЕ РАВЕН НУЛЮ, геометрия геом(Геометрия, 4326) НЕ равна НУЛЮ, ОГРАНИЧЕНИЕ ПЕРВИЧНЫЙ КЛЮЧ (идентификатор) places_pkey)]

Но когда я вынул SQL из журнала, чтобы запустить:

 CREATE TABLE testschema.places (id BIGINT NOT NULL, geom geometry(Geometry, 4326) NOT NULL, CONSTRAINT places_pkey PRIMARY KEY (id))
 

Тогда это работает просто отлично.

Должно быть, я пропустил какую-то очень простую вещь, но я проверил вверх и вниз без какой-либо подсказки. У кого-нибудь есть идея получше?

Комментарии:

1. Не уверен, но просто подумал. Вы пробовали «СОЗДАТЬ РАСШИРЕНИЕ postgis;» перед использованием «геометрии» из расширения?

2. Привет @RakhiAgrawal, да, я устанавливал PostGIS раньше. Добавив, что в предыдущем сценарии все еще возникает та же проблема

3. Привет @LaurenzAlbe Спасибо! В этом, как оказалось, и заключается проблема. Я добавил одну команду SQL, чтобы включить «public» в путь поиска, и это работает

Ответ №1:

Убедитесь, что вы запустили

 CREATE EXTENSION postgis;
 

Затем схема определяет тип данных. Если расширение было создано в public , используйте

 CREATE TABLE places (geom public.geometry, ...);