【发布时间】:2015-05-14 17:49:41
【问题描述】:
我正在使用带有 gradle 的 flyway,我已经在数据库控制台中手动运行了其中一个迁移,我想运行 flyway,但告诉它忽略所有其他迁移版本之间的一个特定迁移版本。这可以做到吗?
【问题讨论】:
标签: flyway
我正在使用带有 gradle 的 flyway,我已经在数据库控制台中手动运行了其中一个迁移,我想运行 flyway,但告诉它忽略所有其他迁移版本之间的一个特定迁移版本。这可以做到吗?
【问题讨论】:
标签: flyway
你必须稍微修改一下才能让它工作,所以我不推荐这种方法,但它会在紧要关头工作。
我只用 Maven 测试过这个,但我很确定它也适用于 Gradle。
迁移到您手动应用的版本之前的版本
# Assuming you applied 01.002 manually
$ mvn flyway:migrate -Dflyway.target=01.001
为您应用的脚本插入一行
-- Make sure these vals closely replicate those from other rows
insert into schema_version( installed_rank, version, description, type, script, checksum, installed_by, installed_on, execution_time, success)
values ( 2, '01.002', 'static_data', 'SQL', 'V01/V01.002__static_data.sql', null, 'username', current_timestamp, 0, true );
修复schema_version校验和
$ mvn flyway:repair
应用其他迁移
$ mvn flyway:migrate -Dflyway.validateOnMigrate=false -Dflyway.outOfOrder=true
那里的两个-D 属性可能不需要,这取决于您是否得到insert 正确与否。 Flyway 可能不同意您的脚本描述,例如,即使校验和现在是正确的。
【讨论】:
insert(例如,如果您的升级脚本在添加现有列或删除已删除的表时失败)。只需通过设置success = 1 允许 Flyway 失败并修复最新线路。您可以在更新脚本的开头使用垃圾进行安全失败(防止进一步可能的危险操作)。只需在flyway:repair 之前清除垃圾
不推荐但如果你仍然想:
1) 运行flywayMigrate,让迁移失败。
2) 手动更新该特定版本迁移的 flyway 元表(成功列)。
3) 再次运行 flywayMigrate。
4) 完成,flyway 现在将开始下一个版本的迁移。
【讨论】:
从版本 7 开始,您可以将其直接添加到您的 Maven 或 Grade 文件中
Gradle - 跳过
flyway {
skipExecutingMigrations = true
}
Maven - 跳过
<configuration>
<skipExecutingMigrations>true</skipExecutingMigrations>
</configuration>
Gradle - 樱桃采摘
flyway {
cherryPick = '2.0'
}
Maven - 樱桃采摘
<configuration>
<cherryPick>2.0</cherryPick>
</configuration>
【讨论】: