时间:2021-07-01 10:21:17 帮助过:20人阅读
发现xorm在0.6.3 和 0.6.4间做了改动,如图
0.6.3
0.6.4
原来如此,去掉了第一个参数,改为全部可变参数了,于是机智的把args...,改为了args。
没想到编译没错,运行时报错了,提示
sql: converting argument $1 type: unsupported type []interface {}, a slice of interface
即类型错误。继续追踪代码,发现session_query.go里有生成sql的函数,代码如下:
- <code class="sourceCode go"><span class="kw">func</span> (session *Session) genQuerySQL(sqlorArgs ...<span class="kw">interface</span>{}) (<span class="dt">string</span>, []<span class="kw">interface</span>{}, <span class="dt">error</span>) {
- <span class="kw">if</span> <span class="fu">len</span>(sqlorArgs) > <span class="dv">0</span> {
- <span class="kw">return</span> sqlorArgs[<span class="dv">0</span>].(<span class="dt">string</span>), sqlorArgs[<span class="dv">1</span>:], <span class="ot">nil</span>
- }
- <span class="co">//省略</span>
- }</code>
由于sqlorArgs是slice,而且builder.ToSql的args也是slice,那么sqlorArgs[1:]又创建了一个新的slice,就让最后返回的slice变成了二元slice了,所以出现了上面的类型错误。
想了一下,其实我觉得上一个版本的函数签名更好,两个参数,一个负责接受sql语句,一个负责接收sql变量。给作者提了issue,或许作者有更好的解决方案。
下面是我的临时解决方法:
- <code class="sourceCode go"><span class="kw">func</span> (session *Session) genQuerySQL(sqlorArgs ...<span class="kw">interface</span>{}) (<span class="dt">string</span>, []<span class="kw">interface</span>{}, <span class="dt">error</span>) {
- <span class="kw">if</span> <span class="fu">len</span>(sqlorArgs) > <span class="dv">0</span> {
- <span class="kw">if</span> <span class="fu">len</span>(sqlorArgs) == <span class="dv">2</span> && reflect.TypeOf(sqlorArgs[<span class="dv">1</span>]).Kind() == reflect.Slice {
- <span class="kw">return</span> sqlorArgs[<span class="dv">0</span>].(<span class="dt">string</span>), sqlorArgs[<span class="dv">1</span>].([]<span class="kw">interface</span>{}), <span class="ot">nil</span>
- }
- <span class="kw">return</span> sqlorArgs[<span class="dv">0</span>].(<span class="dt">string</span>), sqlorArgs[<span class="dv">1</span>:], <span class="ot">nil</span>
- }
- <span class="co">//省略</span>
- }</code>
xorm的sql builder
标签:解决办法 inter log ring reflect 构建 可变参 pos 接收