grails changelog前提条件没有做任何事情

时间:2014-05-07 17:30:25

标签: grails changelog preconditions

我正在尝试使用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)

2 个答案:

答案 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