#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, ...);