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

时间:2015-05-05 05:39:23

标签: grails database-migration liquibase

我有一个名为test-plugin-migration-1.2.groovy的迁移文件,该文件仅被重命名为已在其中列出的迁移和其他一些自定义迁移。

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

我尝试在名为DATABASECHANGELOG

的新文件中为rename-migration.groovy表添加自定义迁移

重命名-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.

如何避免重命名的文件更改集应用于数据库?

2 个答案:

答案 0 :(得分:2)

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

请参阅dbm-changelog-sync

答案 1 :(得分:1)

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

<强>重命名-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()

然后针对数据库运行迁移。