grails changelog前提条件不做任何事情

grails changelog前提条件不做任何事情,grails,changelog,preconditions,Grails,Changelog,Preconditions,我正在尝试使用changelog对数据库进行更改。因为我不能保证特定代码的值当前存在,但可能存在,所以我需要能够检查它们,以便执行插入或更新 这是我一直在测试的东西,它似乎没有任何作用。欢迎提出任何建议 databaseChangeLog = { changeSet(author:'kmert', id:'tubecap-insert-update-1') { preConditions(onFail="WARN",onFailMessage:"Tube cap does

我正在尝试使用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 {
            }
        }
    }
}
更新:我运行了changelog脚本,但是我现在遇到了这个错误。我从网上找到了代码。我找不到很多关于先决条件的文档

|正在为数据库hapi_app_user@jdbc:jtds启动dbm更新:sqlserver://localhost;databaseName=LabTraffic;MVCC=真;锁定超时=10000 解析TubeCapUpdate.groovy时出现问题:没有方法的签名:grails.plugin.databasemigration.DslBuilder.sqlCheck()适用于参数类型:(java.lang.String,java.lang.String)值:[1,从ltc2_tube_cap中选择*code=11](使用--verbose重新运行以查看堆栈跟踪) 解析changelog.groovy时出现问题:没有方法的签名:grails.plugin.databasemigration.DslBuilder.sqlCheck()适用于参数类型:(java.lang.String,java.lang.String)值:[1,从ltc2_tube_cap中选择*,其中代码=11](使用--verbose重新运行以查看堆栈跟踪) groovy.lang.MissingMethodException:没有方法签名:grails.plugin.databasemigration.DslBuilder.sqlCheck()适用于参数类型:(java.lang.String,java.lang.String)值:[1,从ltc2_tube_cap中选择*代码=11] 位于grails.plugin.databasemigration.DslBuilder.invokeMethod(DslBuilder.groovy:117) 在Script1$\u运行\u closure1\u closure2\u closure3.doCall时(Script1.groovy:13) 位于grails.plugin.databasemigration.DslBuilder.invokeMethod(DslBuilder.groovy:117) 在Script1$\u运行\u closure1\u closure2.doCall(Script1.groovy:12) 位于grails.plugin.databasemigration.DslBuilder.invokeMethod(DslBuilder.groovy:117) 在Script1$\u run\u closure1.doCall(Script1.groovy:11) 位于grails.plugin.databasemigration.GrailsChangeLogParser.parse(GrailsChangeLogParser.groovy:84) 位于grails.plugin.databasemigration.DslBuilder.handleIncludedChangeLog(DslBuilder.groovy:747) 位于grails.plugin.databasemigration.DslBuilder.createNode(DslBuilder.groovy:139) 位于grails.plugin.databasemigration.DslBuilder.createNode(DslBuilder.groovy:590) 位于grails.plugin.databasemigration.DslBuilder.invokeMethod(DslBuilder.groovy:117) 在Script1$\u run\u closure1.doCall(Script1.groovy:6) 位于grails.plugin.databasemigration.GrailsChangeLogParser.parse(GrailsChangeLogParser.groovy:84) 更新(liquibase.java:107) 在DbmUpdate$\u run\u closure1\u closure2.doCall处(DbmUpdate:26) 在"DatabaseMigrationCommon"groovy$"运行"closure2"closure11.doCall("DatabaseMigrationCommon"groovy:59) 位于grails.plugin.databasemigration.MigrationUtils.executeInSession(MigrationUtils.groovy:133) 在"DatabaseMigrationCommon"groovy$"运行"closure2.doCall("DatabaseMigrationCommon"groovy:51)
在DbmUpdate$\u run\u closure1.doCall(DbmUpdate:25)

中,确保以下内容

grails dbm-gorm-diff add-your-file-forupdate.groovy -add
然后在您的-file-forupdate.groovy中,您将看到

databaseChangeLog = {
    changeSet(author:'kmert', id:'tubecap-insert-update-1') {
 .
 .
 .
    }
}
然后,重要的是,您要么将此作为迁移脚本文件包含,然后按如下方式执行:

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

包括文件:“您的文件forupdate.groovy”

changelog.groovy始终自始至终运行,因此请确保始终在末尾添加新创建的迁移


干杯!有关更多信息,请参见sqlCheck前提条件的语法不正确

 sqlCheck(expectedResult:'1', 'SELECT * FROM [ltc2_tube_cap] WHERE code=11')
请注意,在代码中,第一个参数是赋值语句
expectedResult=1
,它应该是映射项
expectedResult:1


我在这一页找到了答案。具有讽刺意味的是,在文档中添加了大量的DB迁移DSL示例。

该文件已经添加到my changelog.groovy中。我最终发现它根本没有运行的原因显然是另一个迁移脚本正在消亡。现在,它正在运行,我的困境已经改变。