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

ubof19bj  于 2024-01-06  发布在  Spring
关注(0)|答案(1)|浏览(343)

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

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

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

  1. CREATE SCHEMA IF NOT EXISTS myschema;


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

  1. spring.datasource.initialization-mode=always


应改为:

  1. spring.sql.init.mode=always


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

  1. 2022-10-13 15:34:18.741 INFO 28767 --- [ main] liquibase.database : Set default schema name to null
  2. 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
  3. 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))]


  1. 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
  2. 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:将这样的依赖项添加到项目中。

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

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

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


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

展开查看全部

相关问题