猿问

在 liquibase 开始工作之前,如何在 Postgres DB 中创建模式?

我有独立的应用程序。它在 java、spring-boot、postgres 上,并且有 liquibase。


我需要部署我的应用程序,而 liquibase 应该创建所有表等。但它应该在不公开的自定义模式中进行。liquibase 的所有服务表(databasechangelog 和 databasechangeloglock)也应该在自定义模式中。如何在 liquibase 开始工作之前在 DB 中创建我的模式?我必须在我的应用程序中在部署时、在配置中或类似内容中执行此操作。无需对数据库进行任何手动干预。


应用程序属性:


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

更新:


当 liquibase 启动时,它会创建两张表 databasechangelogs 和一张表。之后,liquibase 开始工作。但是我想要 liquibase liquibase.default-schema = my_schema,但是当 liquibase 开始工作时它不存在并且它是一个错误:异常是 liquibase.exception.LockException: liquibase.exception.DatabaseException: ERROR: schema "my_schema" does not exist


我希望 liquibase 在自定义架构中工作,而不是在公共场合:


liquibase.default-schema = my_schema

但是在 liquibase 可以做到之前,必须创建模式。Liquibase 无法执行此操作,因为它尚未启动,并且启动时需要架构。恶性循环。


交互式爱情
浏览 240回答 2
2回答

德玛西亚99

您可以为此使用Spring Boot Pre-Liquibase 模块。这正是它的意义所在。它在执行 Liquibase 本身之前执行一些 SQL。Pre-Liquibase 将自身设置在 Spring Boot AutoConfigure 链中,以确保它始终在Liquibase之前执行。第1步将以下 Starter 添加到您的项目中:<dependency>&nbsp; &nbsp; <groupId>net.lbruun.springboot</groupId>&nbsp; &nbsp; <artifactId>preliquibase-spring-boot-starter</artifactId>&nbsp; &nbsp; <version>&nbsp; ---latest-version---&nbsp; </version></dependency>第2步添加一个src/main/resources/preliquibase名称postgresql.sql和内容如下的 SQL 文件:CREATE SCHEMA IF NOT EXISTS ${spring.liquibase.default-schema};的${}语法表示的占位符的变量。Pre-Liquibase 将从您的 Spring Environment 中的属性解析它。第 3 步像这样设置应用程序属性:spring.liquibase.default-schema=${my.db.schemaname}spring.jpa.properties.hibernate.default_schema=${my.db.schemaname}现在 - 在这个例子中 - 唯一需要决定的是my.db.schemaname值的来源。那是你的选择。该示例项目主张,它应该来自于一个操作系统环境变量,特别是如果你正在部署到云。最后的话警告:Pre-Liquibase 可能过于灵活,因为它允许执行任何SQL 代码。不要试图将内容放在 Pre-Liquibase 文件中,这些文件理应属于 Liquibase ChangeSet。老实说,我能想到的 Pre-Liquibase 的唯一用法是设置一个数据库“主页”(意味着模式或目录),Liquibase db 对象可以在其中生存,以便可以通过模式或目录分隔同一应用程序的实例同时驻留在同一数据库服务器上。
随时随地看视频慕课网APP

相关分类

Java
我要回答