在低于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,然后正常创建模式,但我想获得帮助,我如何才能以不同的方式解决它?
1条答案
按热度按时间irlmq6kh1#
所以你的目标是为Liquibase本身创建一个预编译器?也就是Liquibase所在的数据库模式?
首先要意识到的是Liquibase(或Flyway)不能很好地与Spring堆栈中提供的其他代理机制一起使用。这包括但不限于:
这是因为执行的顺序,你不能保证哪一个先执行。
Pre-Liquibase来拯救。它正是为此目的而设计的。
步骤1:将这样的依赖项添加到项目中。
字符串
步骤2:现在添加一个名为
default.sql
的文件到src/main/resources/preliquibase/
,内容如下:型
第三步:享受。
完整免责声明:我是Pre-Liquibase的作者。如果你不喜欢引入额外的依赖项,那么请随意查看它的代码。有些人只将Pre-Liquibase用作
test
依赖项。有些人在生产环境中使用它。Pre-Liquibase只在应用程序启动期间起作用。