У меня есть отдельное приложение. Его на java, spring-boot, postgres и у него есть ликбаза.
Мне нужно развернуть мое приложение, и Liquibase должен создать все таблицы и т.д. Но он должен делать это в пользовательской схеме не публично. Все таблицы обслуживания Liquibase (databasechangelog и databasechangeloglock) также должны быть в пользовательской схеме. Как я могу создать свою схему в БД до того, как Liquibase начнет работать? Я должен делать это в своем приложении, когда его развертывание, в конфигурации или что-то вроде. Без ручного вмешательства в БД.
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:
Когда запускается Liquibase, он создает две таблицы databasechangelogs и еще одну таблицу. После этого липибаза начинает работать. Но я хочу Liquibase в liquibase.default-schema = my_schema
, но он не существует, когда Liquibase начинает работать, и это ошибка: исключение - Liquibase.exception.LockException: liquidibase.exception.DatabaseException: ERROR: схема "my_schema" не существует
Я хочу, чтобы Liquibase работала в пользовательской схеме, а не публично:
liquibase.default-schema = my_schema
но до того, как липибаза сможет это сделать, необходимо создать схему. Liquibase не может этого сделать, потому что он еще не начался и для начала ему нужна схема. Порочный круг.
Я нашел решение с моим application.properties.
org.springframework.jdbc.datasource.init.ScriptUtils
работал до использования жидкой базы.
Журналы:
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;
в ресурсы dir и все работает нормально.
Спасибо всем за помощь.
Обновление: это работает для весны загрузки 1.X. Если вы используете Spring Boot 2, вам следует включить schema.sql в файле свойств, spring.datasource.initialization-mode=always
. Больше информации в Spring Boot - загрузка начальных данных