我有一个名为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'
}
它仍然会再次运行重命名的文件迁移。
在浏览update的liquibase
文档后,它解释了
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.
如何避免重命名的文件更改集应用于数据库?
答案 0 :(得分:2)
如果您没有对现有变更集进行任何更改,您可以使用命令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()
然后针对数据库运行迁移。