如何使用 Grails DBMigration 插件更新已经 运行 个数据库迁移文件?

How to update already run database migration files using Grails DBMigration plugin?

我有一个名为 test-plugin-migration-1.2.groovy 的迁移文件,需要重命名的内容只是因为其中列出的迁移已经 运行 和其他一些自定义迁移。

test-plugin-migration-1.2.groovy->test-plugin-migration-1-2.groovy

我尝试在名为 rename-migration.groovy

的新文件中为 DATABASECHANGELOG table 添加自定义迁移

重命名-migration.groovy

changeSet(author: "Laxmi Salunkhe", id: "12345-1") {
    grailsChange {
        change {
            sql.execute("""update DATABASECHANGELOG set 
                filename='test-plugin-migration-1-2.groovy' where
                filename='test-plugin-migration-1.2.groovy'""")
        }
    }
}

changelog.groovy

databaseChangeLog = {

    // Some Old Migrations

    include file: 'rename-migration.groovy'

    // Previously it was test-plugin-migration-1.2.groovy
    include file: 'test-plugin-migration-1-2.groovy' 

    include file: 'new-plugin-migration.groovy'
}

它仍然运行再次重命名文件迁移。

阅读 updateliquibase 文档后,它解释了

Liquibase executes the databaseChangeLog, it reads the changeSets in order and, for each one, checks the “databasechangelog” table to see if the combination of id/author/filepath has been run.

我应该怎么做才能避免在数据库上应用重命名的文件更改集?

如果您不对现有变更集进行任何更改,您可以使用命令 dbm-changelog-sync 它会将所有变更集标记为已执行,因此当您再次 运行-app 时,您的变更日志将不会再次执行并将被视为已应用

dbm-changelog-sync

我找到了解决此问题的方法。我添加了一个 groovy 脚本 rename-file.groovy,它重命名 DATABASECHANGELOG table 中的无效文件名,然后成功迁移 运行。

重命名-file.groovy

import groovy.sql.Sql

@GrabConfig(systemClassLoader = true)
@Grab(group = "mysql", module = "mysql-connector-java", version = "5.1.29")

// Get instance of MYSQL database of old system
Sql sql = Sql.newInstance("jdbc:mysql://localhost:3306/causecode", "root", "sql", "com.mysql.jdbc.Driver")

String oldFileName = "test-plugin-migration-1.2"
String newFileName = oldFileName.replace('.', '_') + '.groovy'
oldFileName = oldFileName + '.groovy'
String query = """
    Update DATABASECHANGELOG
    set filename = "$newFileName", MD5SUM = null
    where filename = "$oldFileName"
"""
sql.executeUpdate query


// Close the connections
sql.close()

然后 运行 迁移到数据库。