Kotlin Springブート、jpa、postgreSQLでフライウェイを構成しようとしています。私の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が、データベースが完全に空の場合(クリーンなdockerイメージ)に、スキーマ履歴テーブルなしで空でないスキーマ「public」を見つけることに文句を言うのはなぜですか?
スプリングブートバージョン2を使用していると仮定します。
Spring Boot 2では、接頭辞は「spring.flyway」なので、以下のように接頭辞spring
を追加してみてください。
spring.flyway.baseline-on-migrate = true
OR
spring.flyway.baselineOnMigrate = true