Spring Boot Flyway:找到非空的架构“public”,没有架构历史表!使用基线()-在空数据库上

cgh8pdjw  于 2023-06-22  发布在  Spring
关注(0)|答案(4)|浏览(177)

我正在尝试使用KotlinSping Boot ,jpa和PostgreSQL配置flyway。我的gradle依赖项是:

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-data-jpa')
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('com.fasterxml.jackson.module:jackson-module-kotlin')
    implementation('org.flywaydb:flyway-core')
    implementation('com.google.code.gson:gson')
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    runtimeOnly('org.postgresql:postgresql')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}

我的application.properties文件是:

spring.datasource.driverClassName=org.postgresql.Driver
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.url=jdbc:postgresql://${JDBC_DATABASE_URL}/jpaTestDatabase
spring.datasource.username=${JDBC_DATABASE_USERNAME}
spring.datasource.password=${JDBC_DATABASE_PASSWORD}

flyway.baseline-on-migrate=true
flyway.locations=classpath:src/main/kotlin/db/migration

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=validate
spring.session.store-type=none

使用jpa和hibernate创建表和条目可以正常工作。但是,在空数据库上执行示例迁移会导致:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: 
Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: 
Found non-empty schema(s) "public" without schema history table! Use baseline() or set baselineOnMigrate to true to initialize the schema history table.

我的目录结构是由spring initializr生成的默认结构,我的迁移位于:demo/src/main/kotlin/db/migration
我只有一个单一的迁移,这是kotlinized版本的示例迁移发现here,我适应了这一行:

class V1__Sample : BaseJavaMigration() {
  override fun migrate(context: Context?) {
    val statement = context?.connection?.prepareStatement(
      """
        CREATE TABLE article (
          id bigserial primary key,
          name varchar(20) NOT NULL,
          desc text NOT NULL
        );
      """
    )
    statement.use { it?.execute() }
  }
}

我错过了什么?为什么Flyway一直抱怨在没有模式历史表的情况下找到非空的模式“public”,而数据库是完全空的(干净的docker镜像)?

zzoitvuj

zzoitvuj1#

假设您使用的是spring-boot版本2。
在 Boot 2中,前缀是“spring.flyway”,因此尝试添加前缀spring,如下所示。
spring.flyway.baseline-on-migrate = true

spring.flyway.baselineOnMigrate = true

d7v8vwbk

d7v8vwbk2#

你可以试试mvn flyway:clean && mvn flyway:migrate

58wvjzkj

58wvjzkj3#

请检查您的数据库的搜索路径,如果公共模式(flyway在其上创建其日志表)不在第一位,它可能无法找到日志表,并可能会抱怨模式历史未找到...
请注意,如果您正在进行基线设置,则需要从脚本文件夹中删除旧脚本,否则将重新尝试。

weylhg0b

weylhg0b4#

同样的错误信息也可以出现当你仍然有东西在回收站。在清空我们的模式之后,我们仍然在回收站中有碎片,并且也得到了错误:
Found non-empty schema(s) "public" without schema history table! Use baseline() or set baselineOnMigrate to true to initialize the schema history table.
清除回收站后,错误消失。这是在Oracle 19c数据库与Flyway 9.5.1。

相关问题