Как создать схему в БД Postgres, до того как жидкость начнет работать? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть отдельное приложение.Это на Java, Spring-Boot, Postgres и имеет жидкость.

Мне нужно развернуть мое приложение, а liquibase должен создать все таблицы и т. Д. Но он должен сделать это в пользовательской схеме, не являющейся публичной.Все служебные таблицы liquibase (databasechangelog и databasechangeloglock) также должны быть в пользовательской схеме.Как я могу создать свою схему в БД до того, как жидкость начнет работать?Я должен сделать это внутри моего приложения, когда оно развертывается, в конфигурации или что-то подобное.Без какого-либо ручного вмешательства в базу данных.

application.properties:

spring.datasource.jndi-name=java:/PostgresDS
spring.jpa.properties.hibernate.default_schema=my_schema
spring.jpa.show-sql = false
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.datasource.continue-on-error=true
spring.datasource.sql-script-encoding=UTF-8

liquibase.change-log = classpath:liquibase/changelog-master.yaml
liquibase.default-schema = my_schema

UPD:

Когда запускается жидкая база, создается две таблицы databaseloglogs и еще одна таблица.После этого ликвидазы начинают работать.Но я хочу использовать liquibase в liquibase.default-schema = my_schema, но он не существует, когда liquibase начинает работать, и это ошибка: исключение - liquibase.exception.LockException: liquibase.exception.DatabaseException: ОШИБКА: схема "my_schema" не существует

Я хочу работать с liquibase в пользовательской схеме, а не публично:

liquibase.default-schema = my_schema

, но прежде чем liquibase сможет это сделать, схема должна быть создана.Liquibase не может этого сделать, потому что он еще не запущен и для запуска нужна схема.Замкнутый круг.

1 Ответ

0 голосов
/ 27 сентября 2018

Я нашел решение с моим application.properties.

org.springframework.jdbc.datasource.init.ScriptUtils работал до liquibase.

Журналы:

14:11:14,760 INFO  [org.springframework.jdbc.datasource.init.ScriptUtils] 
(ServerService Thread Pool -- 300) Executing SQL script from URL 
[vfs:/content/app.war/WEB-INF/classes/schema.sql]

14:11:14,761 INFO  [org.springframework.jdbc.datasource.init.ScriptUtils] 
(ServerService Thread Pool -- 300) Executed SQL script from URL 
[vfs:/content/app.war/WEB-INF/classes/schema.sql] in 1 ms.

14:11:14,912 ERROR [stderr] (ServerService Thread Pool -- 300) INFO 9/27/18 
2:11 PM: liquibase: Successfully acquired change log lock

14:11:15,292 ERROR [stderr] (ServerService Thread Pool -- 300) INFO 9/27/18 
2:11 PM: liquibase: Reading from my_schema.databasechangelog

14:11:15,320 ERROR [stderr] (ServerService Thread Pool -- 300) INFO 9/27/18 
2:11 PM: liquibase: Successfully released change log lock

Я просто поместил schema.sql с CREATE SCHEMA IF NOT EXISTS my_schema; в каталог ресурсов и все работает нормально.

Спасибо всем за помощь.

Обновление : Это работает для Spring boot 1.X.Если вы используете Spring Boot 2, вам следует включить schema.sql в файле свойств с spring.datasource.initialization-mode=always.Больше информации в Spring Boot - загрузка начальных данных

...