【问题标题】:Flyway - Force run repeatable scriptsFlyway - 强制运行可重复的脚本
【发布时间】:2017-03-01 09:59:49
【问题描述】:

我们有一个流程,其末尾有一个永不改变的可重复脚本。所以校验和不会改变。 有没有办法告诉 Flyway 运行它,而不管它之前是否运行过?强制它再次运行。

目前,我正在使用独特的注释以编程方式更改文件以强制它运行。但是当脚本在 Jar 中时会变得很棘手。

【问题讨论】:

    标签: flyway


    【解决方案1】:

    听起来您的脚本应该作为回调运行,这将为您提供所需的行为。

    【讨论】:

    • 这肯定是正确答案,请查看callback documentation
    • 谢谢。愚蠢地忽​​略了文档中的回调部分,因为没有看到连接。文档指出运行带有回调后缀的脚本,但我发现只有完全命名为回调的脚本才会运行。这是一个错误还是我误解了?另外,我认为如果这些记录在 schema_version 表中会非常有用,因为目前没有记录它们已经运行。
    • @Stephen 如果您想保留审计跟踪,我在下面有一个替代解决方案。
    【解决方案2】:

    Axels 的答案是开箱即用的正确答案。

    如果您有其他要求,例如在 schema_version 中记录它们的执行,您可以在 Java Migrations 中使用 random checksum 包装它的执行。

    public class R__MyRepeatable implements JdbcMigration, MigrationChecksumProvider {
    
        @Override
        public final void migrate(Connection connection) throws Exception {
            String scriptLocation = "path/to/maintenance_script.sql";
            try (InputStream in = getClass().getResourceAsStream(scriptLocation)) {
    
                if (in == null) {
                    throw new IllegalStateException("Cannot find file: " + scriptLocation);
                }
    
                String sql = IOUtils.toString(in, "UTF-8");
    
                connection.prepareStatement(sql).execute();
            }
        }
    
        @Override
        public Integer getChecksum() {
            return ...; // Whatever random / timebased scheme you want.
        }
    }
    

    【讨论】:

    • 嗨,这似乎可行。尚未尝试,因为优先事项已经转移。需要将可重复脚本移动到其自己的文件夹以停止与其他迁移一起运行(第一次)。此外,每个可重复的脚本都需要其中一个,而不是每个文件夹。干杯!
    【解决方案3】:

    如果您将脚本命名为“afterMigrate.sql”,则每次迁移后都会通过 flyway 执行它。参见 Flyway 文档https://flywaydb.org/documentation/callbacks1

    【讨论】:

      猜你喜欢
      • 2016-07-14
      • 2020-05-13
      • 2020-08-17
      • 2012-01-23
      • 2022-01-03
      • 2016-04-27
      • 1970-01-01
      • 2015-06-03
      • 2020-03-14
      相关资源
      最近更新 更多