如果使用dbm-update指定任何上下文,我们总是会遇到异常,无论该上下文是否有任何changeSet。如果我们没有指定上下文,我们就可以获得所有内容 - 它可以工作,但显然它会创建不合适的数据。
由于没有实际的例子,我们在Windows 8(& java 7 64 bit,mysql 5.6)上尝试了许多可能的语法命令,包括:
grails dbm-update --stacktrace --verbose --contexts="ABC"
grails dbm-update --stacktrace --verbose "--contexts=ABC"
grails dbm-update --stacktrace --verbose "--contexts=[ABC]"
grails dbm-update --stacktrace --verbose --contexts=ABC
所有变体都提供以下堆栈跟踪:
groovy.lang.MissingMethodException: No signature of method: liquibase.Liquibase.update() is applicable for argument types: (java.lang.Boolean) values: [true]
Possible solutions: update(java.lang.String), update(int, java.lang.String), update(java.lang.String, java.io.Writer), u
pdate(int, java.lang.String, java.io.Writer), validate(), isCase(java.lang.Object)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:56)
at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:46)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:122)
at DbmUpdate$_run_closure1$_closure2.doCall(DbmUpdate:26)
at DbmUpdate$_run_closure1$_closure2.doCall(DbmUpdate)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaM
ethodSite.java:207)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:68)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:114)
at _DatabaseMigrationCommon_groovy$_run_closure2$_closure11.doCall(_DatabaseMigrationCommon_groovy:59)
at _DatabaseMigrationCommon_groovy$_run_closure2$_closure11.doCall(_DatabaseMigrationCommon_groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaM
ethodSite.java:207)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:68)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:114)
at grails.plugin.databasemigration.MigrationUtils.executeInSession(MigrationUtils.groovy:133)
at grails.plugin.databasemigration.MigrationUtils$executeInSession$3.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
注意:这只是实际堆栈跟踪的一小部分。
我们对上下文定义的唯一更改集如下:
<changeSet id="baseline_data_account_type_uk" author="me.me" context="UK">
<comment>Insert UK account types</comment>
<sqlFile path="sql//baseline//account_type_UK.sql" />
</changeSet>
如果我们没有在dbm-update命令行上指定任何上下文,它在此更改集中正确运行简单更新SQL没问题,因此它对changeset或changelog没有问题。
我当然在dev dataSource中删除了“dbCreate = xxx”行。
它是一个完整的猜测,但这可能与插入sql中的布尔类型有关。上面的变更集引用了account_type_UK.sql,即:
INSERT INTO `account_type` (`id`, `version`, `is_default`, `name`) VALUES
(3, 0, b'1', 'Bonus'),
(4, 0, b'1', 'Demo');
以上工作完美,正确插入数据时没有指定上下文。
另一个线索是,如果指定了上下文,我们会得到缺少的方法异常,但不会创建架构。这可能意味着问题出现在架构级别。使用dbm-gorm-diff
生成的单个xml更改日志创建模式有什么想法吗?
答案 0 :(得分:0)
看起来Grails正在调用的版本与您拥有的Liquibase版本之间的版本不兼容。 Grails正在寻找您正在使用的Liquibase版本中不存在的update()版本。你能检查一下Liquibase版本应与Grails 2.5兼容吗?