我正在尝试使用changelog更改数据库。由于我不能保证特定代码当前存在的值,但可能存在,我需要能够检查它们,以便进行插入或更新。
这是我一直在测试的,似乎没有做任何事情。欢迎提出任何建议。
databaseChangeLog = {
changeSet(author:'kmert', id:'tubecap-insert-update-1') {
preConditions(onFail="WARN",onFailMessage:"Tube cap does not exist,skipping because it cannot be updated."){
sqlCheck(expectedResult='1', 'SELECT * FROM [ltc2_tube_cap] WHERE code=11')
}
grailsChange {
change {
sql.execute("""
UPDATE [ltc2_tube_cap]
SET [name] = 'White'
WHERE [code] = 11;
""")
}
rollback {
}
}
}
}
更新:我运行了更改日志脚本,但我现在收到此错误。我从在线资源中找到了代码。我找不到很多关于先决条件的文件......
|启动数据库的dbm-update hapi_app_user @jdbc:jtds:sqlserver:// localhost; databaseName = LabTraffic; MVCC = TRUE; LOCK_TIMEOUT = 10000 解析问题TubeCapUpdate.groovy:没有方法签名:grails.plugin.databasemigration.DslBuilder.sqlCheck()适用于参数类型:(java.lang.String,java.lang.String)值:[1,SELECT * FROM ltc2_tube_cap WHERE code = 11](使用--verbose重新运行以查看堆栈跟踪) 解析changelog.groovy:没有方法签名:grails.plugin.databasemigration.DslBuilder.sqlCheck()适用于参数类型:(java.lang.String,java.lang.String)values:[1,SELECT * FROM ltc2_tube_cap WHERE code = 11](使用--verbose重新运行以查看堆栈跟踪) groovy.lang.MissingMethodException:没有方法签名:grails.plugin.databasemigration.DslBuilder.sqlCheck()适用于参数类型:(java.lang.String,java.lang.String)values:[1,SELECT * FROM ltc2_tube_cap WHERE代码= 11] at grails.plugin.databasemigration.DslBuilder.invokeMethod(DslBuilder.groovy:117) 在Script1 $ _run_closure1_closure2_closure3.doCall(Script1.groovy:13) at grails.plugin.databasemigration.DslBuilder.invokeMethod(DslBuilder.groovy:117) 在Script1 $ _run_closure1_closure2.doCall(Script1.groovy:12) at grails.plugin.databasemigration.DslBuilder.invokeMethod(DslBuilder.groovy:117) 在Script1 $ _run_closure1.doCall(Script1.groovy:11) at grails.plugin.databasemigration.GrailsChangeLogParser.parse(GrailsChangeLogParser.groovy:84) at grails.plugin.databasemigration.DslBuilder.handleIncludedChangeLog(DslBuilder.groovy:747) at grails.plugin.databasemigration.DslBuilder.createNode(DslBuilder.groovy:139) at grails.plugin.databasemigration.DslBuilder.createNode(DslBuilder.groovy:590) at grails.plugin.databasemigration.DslBuilder.invokeMethod(DslBuilder.groovy:117) 在Script1 $ _run_closure1.doCall(Script1.groovy:6) at grails.plugin.databasemigration.GrailsChangeLogParser.parse(GrailsChangeLogParser.groovy:84) at liquibase.Liquibase.update(Liquibase.java:107) 在DbmUpdate $ _run_closure1_closure2.doCall(DbmUpdate:26) 在_DatabaseMigrationCommon_groovy $ _run_closure2_closure11.doCall(_DatabaseMigrationCommon_groovy:59) at grails.plugin.databasemigration.MigrationUtils.executeInSession(MigrationUtils.groovy:133) at _DatabaseMigrationCommon_groovy $ _run_closure2.doCall(_DatabaseMigrationCommon_groovy:51) 在DbmUpdate $ _run_closure1.doCall(DbmUpdate:25)
答案 0 :(得分:2)
sqlCheck preCondition的语法不正确。
sqlCheck(expectedResult:'1', 'SELECT * FROM [ltc2_tube_cap] WHERE code=11')
请注意,在您的代码中,第一个参数是赋值语句expectedResult=1
,它应该是映射条目expectedResult:1
。
我在这个Jira页面上找到了答案。 https://jira.grails.org/browse/GPDATABASEMIGRATION-40具有讽刺意味的是将大量示例添加到数据库迁移DSL到文档。
答案 1 :(得分:0)
确保以下
grails dbm-gorm-diff add-your-file-forupdate.groovy -add
然后在你的文件-forupdate.groovy里面会看到
databaseChangeLog = {
changeSet(author:'kmert', id:'tubecap-insert-update-1') {
.
.
.
}
}
然后,重要的是要么将此作为迁移脚本文件包含在内,如下所示:
只需手动添加如下所示的行到grails的末尾 - app / migrations / changelog.groovy:
包含文件:' your-file-forupdate.groovy'
changelog.groovy始终从头到尾运行,因此请确保始终将新创建的迁移添加到最后。
干杯!有关详细信息,请参阅this