4

我正在尝试使用更改日志对数据库进行更改。由于我不能保证特定代码的值当前存在,但可能存在,因此我需要能够检查它们以便进行插入或更新。

这是我一直在测试的,它似乎没有做任何事情。欢迎任何意见。

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 {
            }
        }
    }
}

更新:我运行了更改日志脚本,但现在出现此错误。我从在线资源中找到了代码。我找不到很多关于先决条件的文档...

| 为数据库 hapi_app_user @ jdbc:jtds:sqlserver://localhost;databaseName=LabTraffic;MVCC=TRUE;LOCK_TIMEOUT=10000 解析 TubeCapUpdate.groovy 问题启动 dbm-update:没有方法签名:grails.plugin.databasemigration.DslBuilder.sqlCheck( ) 适用于参数类型:(java.lang.String, java.lang.String) 值:[1, SELECT * FROM ltc2_tube_cap WHERE code=11] (使用 --verbose 重新运行以查看堆栈跟踪)问题解析更改日志.groovy:没有方法签名:grails.plugin.databasemigration.DslBuilder.sqlCheck() 适用于参数类型:(java.lang.String, java.lang.String) 值:[1, SELECT * FROM ltc2_tube_cap WHERE code= 11](使用 --verbose 重新运行以查看堆栈跟踪)groovy.lang.MissingMethodException:没有方法签名:grails.plugin.databasemigration.DslBuilder.sqlCheck() 适用于参数类型:

4

2 回答 2

2

sqlCheck 前置条件的语法不正确。

 sqlCheck(expectedResult:'1', 'SELECT * FROM [ltc2_tube_cap] WHERE code=11')

请注意,在您的代码中,第一个参数是一个赋值语句expectedResult=1,它应该是一个映射条目expectedResult:1

我在这个 Jira 页面上找到了答案。https://jira.grails.org/browse/GPDATABASEMIGRATION-40具有讽刺意味的是,将大量示例添加到数据库迁移 DSL 到文档中。

于 2015-07-21T22:00:53.600 回答
0

确保以下

grails dbm-gorm-diff add-your-file-forupdate.groovy -add

然后在 your-file-forupdate.groovy 内预计会看到

databaseChangeLog = {
    changeSet(author:'kmert', id:'tubecap-insert-update-1') {
 .
 .
 .
    }
}

然后,最重要的是您已将其包含为要执行的迁移脚本文件,如下所示:

只需在 grails- app/migrations/changelog.groovy的末尾手动添加如下一行:

包含文件:'your-file-forupdate.groovy'

changelog.groovy 始终从头到尾运行,因此请确保始终将新创建的迁移添加到末尾。

干杯! 有关更多信息,请参阅

于 2014-05-08T05:37:33.053 回答