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)?
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