Flyway社区版能否添加自定义校验?含文件后缀校验需求
Flyway社区版实现自定义文件后缀校验(仅接受
.sql,忽略.SQL) Flyway社区版没有内置配置项直接实现这种后缀校验,但可以通过自定义MigrationResolver来达成需求,以下是具体实现方案:
实现思路
Flyway的迁移文件加载逻辑由MigrationResolver接口控制,我们可以自定义实现该接口,在解析迁移文件时过滤掉后缀为.SQL的文件,仅保留.sql后缀的文件。
代码实现示例
自定义MigrationResolver
import org.flywaydb.core.api.resolver.MigrationResolver; import org.flywaydb.core.api.resolver.ResolvedMigration; import org.flywaydb.core.internal.resolver.CompositeMigrationResolver; import org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver; import java.util.List; import java.util.stream.Collectors; public class CaseSensitiveSqlMigrationResolver implements MigrationResolver { private final MigrationResolver delegate; public CaseSensitiveSqlMigrationResolver() { // 复用默认的SQL迁移解析器逻辑 this.delegate = new CompositeMigrationResolver(List.of(new SqlMigrationResolver())); } @Override public List<ResolvedMigration> resolveMigrations() { return delegate.resolveMigrations().stream() // 过滤仅保留小写.sql后缀的文件 .filter(migration -> migration.getScript().endsWith(".sql")) .collect(Collectors.toList()); } }
配置自定义Resolver
Spring Boot项目
注册自定义Resolver为Spring Bean即可:
import org.flywaydb.core.Flyway; import org.springframework.boot.autoconfigure.flyway.FlywayProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FlywayConfig { @Bean public Flyway flyway(FlywayProperties flywayProperties) { Flyway flyway = Flyway.configure() .dataSource(flywayProperties.getUrl(), flywayProperties.getUser(), flywayProperties.getPassword()) .locations(flywayProperties.getLocations()) // 绑定自定义解析器 .resolvers(new CaseSensitiveSqlMigrationResolver()) .load(); flyway.migrate(); return flyway; } }
纯Java项目
直接在Flyway初始化时指定自定义Resolver:
Flyway flyway = Flyway.configure() .dataSource("jdbc:h2:mem:testdb", "sa", "") .locations("classpath:db/migration") .resolvers(new CaseSensitiveSqlMigrationResolver()) .load(); flyway.migrate();
注意事项
- 上述示例复用了Flyway默认的SQL迁移解析逻辑,仅添加过滤规则,不会影响Java迁移等其他类型的迁移加载。
- 该方案完全基于Flyway社区版的扩展能力实现,无需依赖商业版功能。
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

