如何使用 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'
}
它仍然运行再次重命名文件迁移。
阅读 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.
我应该怎么做才能避免在数据库上应用重命名的文件更改集?
如果您不对现有变更集进行任何更改,您可以使用命令 dbm-changelog-sync
它会将所有变更集标记为已执行,因此当您再次 运行-app 时,您的变更日志将不会再次执行并将被视为已应用
我找到了解决此问题的方法。我添加了一个 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()
然后 运行 迁移到数据库。
我有一个名为 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'
}
它仍然运行再次重命名文件迁移。
阅读 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.
我应该怎么做才能避免在数据库上应用重命名的文件更改集?
如果您不对现有变更集进行任何更改,您可以使用命令 dbm-changelog-sync
它会将所有变更集标记为已执行,因此当您再次 运行-app 时,您的变更日志将不会再次执行并将被视为已应用
我找到了解决此问题的方法。我添加了一个 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()
然后 运行 迁移到数据库。