web-dev-qa-db-fra.com

Voie de migration: schéma (s) non vide trouvé (s) "public" sans table d'historique de schéma! Utiliser baseline () - sur une base de données vide

J'essaie de configurer flyway avec kotlin Spring boot, jpa et postgreSQL. Mes dépendances gradle sont:

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')
}

Mon fichier application.properties est:

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

La création de tables et d'entrées à l'aide de jpa et de mise en veille prolongée fonctionne comme prévu. Cependant, un exemple de migration sur une base de données vide se traduit par:

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.

ma structure de répertoires est celle par défaut générée par spring initializr et mes migrations sont dans: demo/src/main/kotlin/db/migration

Je n'ai qu'une seule migration qui est la version kotlinisée de l'exemple de migration trouvée ici que j'ai adapté pour regarder ceci:

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() }
  }
}

Qu'est-ce que j'oublie ici? Pourquoi Flyway continue-t-il de se plaindre de trouver des schémas non vides "publics" sans table d'historique de schéma, lorsque la base de données est complètement vide (image de docker propre)?

8
jsk

En supposant que vous utilisez la version 2 de Spring-Boot.

Dans Spring Boot 2, le préfixe est "spring.flyway", essayez donc d'ajouter le préfixe spring comme ci-dessous.

spring.flyway.baseline-on-migrate = true

OR

spring.flyway.baselineOnMigrate = true

13
Alien