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
调整 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>
若使用 Gradle
groovydependencies { // implementation("org.flywaydb:flyway-core") // 不再需要 implementation("org.flywaydb:flyway-database-postgresql:10.20.1") runtimeOnly("org.postgresql:postgresql:42.7.2") }
方案二:完整配置解决方案
适用于新项目搭建或需详细配置的场景:
完整 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>
Flyway 配置(application.yml)
yamlflyway: enabled: true baseline-on-migrate: true # 首次迁移时自动创建基线 baseline-version: 1 # 初始版本号 # locations: classpath:db/migration # 可选:SQL文件路径
关键配置说明:
baseline-on-migrate
: 对已有数据库启用迁移baseline-version
: 设置初始版本,避免版本冲突
注意事项
- 所有
org.flywaydb
依赖版本必须保持一致 - PostgreSQL JDBC 驱动需 ≥ 42.7.2
- 从 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)中开箱即用,当前使用上述配置可稳定工作于生产环境。