在spring中使用liquibase创建数据库模式不起作用

ubof19bj  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(269)

在低于2.5.0的Sping Boot 版本中,我在application.properties中进行了以下配置:

spring.datasource.initialization-mode=always
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb?currentSchema=myschema
spring.datasource.username=root
spring.datasource.password=pass
spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.xml
spring.liquibase.default-schema=myschema
spring.liquibase.liquibase-schema=myschema

字符串
此外,在schema.sql文件中,我有这样一个查询来在数据库中创建一个模式:

CREATE SCHEMA IF NOT EXISTS myschema;


而在2.5.0版本的Sping Boot 中,配置字段:

spring.datasource.initialization-mode=always


应改为:

spring.sql.init.mode=always


不幸的是,在应用了2.5.0版的这些更改后,liquibase解决方案不能按预期工作,并且没有创建数据库模式。这是什么原因造成的?如何处理?
出现的错误有:

2022-10-13 15:34:18.741  INFO 28767 --- [           main] liquibase.database                       : Set default schema name to null
2022-10-13 15:34:18.748  WARN 28767 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.LockException: liquibase.exception.DatabaseException: ERROR: no schema has been selected to create in
  Pozycja: 14 [Failed SQL: (0) CREATE TABLE databasechangeloglock (ID INTEGER NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP WITHOUT TIME ZONE, LOCKEDBY VARCHAR(255), CONSTRAINT databasechangeloglock_pkey PRIMARY KEY (ID))]


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.LockException: liquibase.exception.DatabaseException: ERROR: schema "myschema" does not exist
  Pozycja: 14 [Failed SQL: (0) CREATE TABLE myschema.databasechangeloglock (ID INTEGER NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP WITHOUT TIME ZONE, LOCKEDBY VARCHAR(255), CONSTRAINT databasechangeloglock_pkey PRIMARY KEY (ID))]


我想到的唯一解决方案是在应用程序第一次启动时关闭liqibase,然后正常创建模式,但我想获得帮助,我如何才能以不同的方式解决它?

irlmq6kh

irlmq6kh1#

所以你的目标是为Liquibase本身创建一个预编译器?也就是Liquibase所在的数据库模式?
首先要意识到的是Liquibase(或Flyway)不能很好地与Spring堆栈中提供的其他代理机制一起使用。这包括但不限于:

  • Sping Boot DataSource初始化使用基本SQL脚本(这是您提到的脚本)
  • JPA(或Hibernate)的编译机制

这是因为执行的顺序,你不能保证哪一个先执行。
Pre-Liquibase来拯救。它正是为此目的而设计的。
步骤1:将这样的依赖项添加到项目中。

<dependency>
    <groupId>net.lbruun.springboot</groupId>
    <artifactId>preliquibase-spring-boot-starter</artifactId>
    <version>1.5.0</version> <!-- exact version would depend on which version of Spring Boot you're using -->
</dependency>

字符串
步骤2:现在添加一个名为default.sql的文件到src/main/resources/preliquibase/,内容如下:

CREATE SCHEMA IF NOT EXISTS ${spring.liquibase.default-schema};


第三步:享受。
完整免责声明:我是Pre-Liquibase的作者。如果你不喜欢引入额外的依赖项,那么请随意查看它的代码。有些人只将Pre-Liquibase用作test依赖项。有些人在生产环境中使用它。Pre-Liquibase只在应用程序启动期间起作用。

相关问题