Skip to content

Flyway 不支持 PostgreSQL 17 的解决方法

问题描述

使用 Flyway 进行数据库迁移时,遇到错误提示Unsupported Database: PostgreSQL 17.0,即使已升级到最新 Flyway 版本(10.20.1)并更换 PostgreSQL 版本问题仍然存在。典型错误场景:

  • 已安装 PostgreSQL 17
  • 使用 Maven 依赖:
    xml
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
        <version>10.20.1</version>
    </dependency>
  • 尝试更换 PostgreSQL 版本和 Flyway 依赖均无效

此问题的根本原因是:Flyway 10.x 版本架构改动后,需额外添加数据库专用依赖包才能支持 PostgreSQL

解决方案

以下是两种有效解决方式,选用任一即可:

方案一:添加 PostgreSQL 专用依赖(推荐)

核心思路

Flyway 从 8.0+ 版本开始采用模块化设计,需额外添加数据库特定依赖包flyway-database-postgresql

  1. 调整 Maven 依赖pom.xml中添加:

    xml
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-database-postgresql</artifactId>
        <version>10.20.1</version> <!-- 与 flyway-core 版本一致 -->
    </dependency>

    同时确保 JDBC 驱动兼容 PostgreSQL 17:

    xml
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.7.2</version> <!-- 支持 PG 17 的最低版本 -->
    </dependency>
  2. 若使用 Gradle

    groovy
    dependencies {
        // implementation("org.flywaydb:flyway-core") // 不再需要
        implementation("org.flywaydb:flyway-database-postgresql:10.20.1")
        runtimeOnly("org.postgresql:postgresql:42.7.2")
    }

方案二:完整配置解决方案

适用于新项目搭建或需详细配置的场景:

  1. 完整 Maven 依赖

    xml
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
        <version>10.20.1</version>
    </dependency>
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-database-postgresql</artifactId>
        <version>10.20.1</version>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.7.2</version>
        <scope>runtime</scope>
    </dependency>
  2. Flyway 配置(application.yml)

    yaml
    flyway:
      enabled: true
      baseline-on-migrate: true  # 首次迁移时自动创建基线
      baseline-version: 1        # 初始版本号
      # locations: classpath:db/migration # 可选:SQL文件路径

    关键配置说明:

    • baseline-on-migrate: 对已有数据库启用迁移
    • baseline-version: 设置初始版本,避免版本冲突

注意事项

  1. 所有org.flywaydb依赖版本必须保持一致
  2. PostgreSQL JDBC 驱动需 ≥ 42.7.2
  3. 从 Flyway 9.x 升级的用户需特别注意此模块化改动

原理说明

Flyway 的架构变更导致此兼容性问题:

  • Flyway 8.0+: 核心模块(flyway-core)与数据库支持模块分离
  • PostgreSQL 支持: 需通过flyway-database-postgresql实现
  • 版本映射:

验证结果

配置完成后执行迁移命令应显示成功信息:

Successfully applied X migrations (execution time YYZms)

而非之前的Unsupported Database错误。

替代方案(临时)

不推荐

若项目无法立即调整依赖,可临时降级数据库:

bash
# 卸载 PostgreSQL 17
sudo apt remove postgresql-17

# 安装 PostgreSQL 16.6
sudo apt install postgresql-16

但此为临时方案,官方即将全面支持 PG 17

总结

关键点操作指引
核心缺失依赖添加flyway-database-postgresql
JDBC驱动版本≥ postgresql 42.7.2
版本一致性所有Flyway依赖保持相同版本
升级路径参考 Flyway 官方迁移文档

Flyway对PostgreSQL 17的完整支持预计在后续版本(如11.x)中开箱即用,当前使用上述配置可稳定工作于生产环境。