13
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gradleから最新版のFlywayを実行しようとしたら No database found to handle になった

Posted at

現象

  • SpringBootでアプリケーションを作成
  • ビルドはGradle(Mavenでも変わらないと思います)
  • GradleからFlywayを操作したくて設定を記述
  • flyway clean を実行したところ No database found to handle というエラーが出て実行出来ない
  • DB設定は正しいはず(正しかった)
  • ※ 依存のバージョンは読み替えてください

解決方法

build.gradleのpluginsの前に下記を記入する必要がある

buildscript {
    dependencies {
        classpath("org.flywaydb:flyway-database-postgresql:10.7.2")
    }
}

エラー全文

Execution failed for task ':flywayClean'.
> Error occurred while executing flywayClean
  No database found to handle jdbc:postgresql://localhost:5432/postgres

build.gradle全文

buildscript {
    dependencies {
        classpath("org.flywaydb:flyway-database-postgresql:10.7.2")
    }
}

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.2'
    id 'io.spring.dependency-management' version '1.1.4'
    id "org.flywaydb.flyway" version "10.7.2"
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'

    runtimeOnly 'org.postgresql:postgresql'
    // https://mvnrepository.com/artifact/org.flywaydb/flyway-core
    implementation 'org.flywaydb:flyway-core:10.7.2'
    // https://mvnrepository.com/artifact/org.flywaydb/flyway-database-postgresql
    runtimeOnly 'org.flywaydb:flyway-database-postgresql:10.7.2'

    annotationProcessor 'org.projectlombok:lombok'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

flyway {
    url = 'jdbc:postgresql://localhost:5432/postgres'
    user = 'postgres'
    password = 'example'
    locations = ['classpath:db/migration']
    cleanDisabled = false
}

何が起こったのか

Flyway10.0 から
データベースサポートが flyway-core から分離されたようです。
これにより各データベースの依存を runtimeOnly で追加しなければならなくなりました。

これは情報があるのでまだわかるのですが、
Gradle からflywayを使用する際はbuildscriptにclasspathを追加しなければならないという情報は下記URLを見ないとわかりませんでした。

メッセージが的外れという話はこのissueでも出ているのでいずれ改善があるかもしれません。

SpringBootのGradleプロジェクトでFlywayを使用する際に行う設定

これまでの設定

  • plugins に flyway の設定を追加
id "org.flywaydb.flyway" version "10.7.2"
  • dependencies に flyway-core を追加
implementation 'org.flywaydb:flyway-core:10.7.2'
  • flyway のスクリプトを追加
flyway {
    url = 'jdbc:postgresql://localhost:5432/postgres'
    user = 'postgres'
    password = 'example'
    locations = ['classpath:db/migration']
    cleanDisabled = false
}

※ 話が少し逸れますがいつのバージョンからかうっかり clean コマンドを実行しないようにデフォルト設定でcleanコマンドが使えなくなるcleanDisabledというプロパティが追加されていました。cleanコマンドを使うにはこれを無効化する必要があります。

新たに追加する必要のある設定

  • buildscriptのdependenciesでflywayのDBへのclasspath(postgresqlの場合は flyway-database-postgresql を設定(MySQLなど他のDBでも同様)
buildscript {
    dependencies {
        classpath("org.flywaydb:flyway-database-postgresql:10.7.2")
    }
}
  • dependenciesにDBの依存を追加
runtimeOnly 'org.flywaydb:flyway-database-postgresql:10.7.2'

runtimeOnly 'org.flywaydb:flyway-database-postgresql' を設定しなかったときのエラーメッセージ

エラーメッセージだけを見てdb向けの依存が無いということを見抜くのは難しいです

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unsupported Database: PostgreSQL 15.2
13
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?