最近在使用xorm,并使用了sql builder来构建sql查询没想到升级后原来可以使用的代码居然报错了。

0x00 代码

sql, args, _ := builder.Select("*").
From("user").
Where(builder.Eq{"uid": 1}).
ToSQL()
res, err := orm.QueryString(sql, args...)

0x01 对比

发现xorm在0.6.3 和 0.6.4间做了改动,如图

0.6.3

0.6.4

原来如此,去掉了第一个参数,改为全部可变参数了,于是机智的把args...,改为了args

关于可变参数的问题,可以参考我的这篇文章

0x02 新错误

没想到编译没错,运行时报错了,提示

sql: converting argument $1 type: unsupported type []interface {}, a slice of interface

即类型错误。继续追踪代码,发现session_query.go里有生成sql的函数,代码如下:

func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interface{}, error) {
if len(sqlorArgs) > 0 {
return sqlorArgs[0].(string), sqlorArgs[1:], nil
}
//省略
}

由于sqlorArgs是slice,而且builder.ToSql的args也是slice,那么sqlorArgs[1:]又创建了一个新的slice,就让最后返回的slice变成了二元slice了,所以出现了上面的类型错误。

0x03 解决办法

想了一下,其实我觉得上一个版本的函数签名更好,两个参数,一个负责接受sql语句,一个负责接收sql变量。给作者提了issue,或许作者有更好的解决方案。

下面是我的临时解决方法:

func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interface{}, error) {
if len(sqlorArgs) > 0 {
if len(sqlorArgs) == 2 && reflect.TypeOf(sqlorArgs[1]).Kind() == reflect.Slice {
return sqlorArgs[0].(string), sqlorArgs[1].([]interface{}), nil
}
return sqlorArgs[0].(string), sqlorArgs[1:], nil
}
//省略
}

作者已经更新,方法更加巧妙,增加了builder类型

用法,直接传builder即可

xorm的sql builder的更多相关文章

  1. SQL Builder 1.04

    解析效果: select id,code,name,utime,src,ctime from stock where id<20 and code like '%6%' order by id, ...

  2. MyBatis(3.2.3) - Dynamic SQL

    Sometimes, static SQL queries may not be sufficient for application requirements. We may have to bui ...

  3. 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)

    该篇是 Grissom.CMS 框架系列文章的第三篇, 主要介绍框架用到的核心库 EasyJsonToSql, 把标准的配置文件和数据结构解析成可执行的 sql. 该框架能实现自动化增删改查得益于 E ...

  4. PetaPoco源代码学习--3.Sql类

    PetaPoco对数据库的操作直接使用SQL语句,在代码中进行调用既可以直接传递SQL语句,也可以使用提供的SQL类来获取到SQL语句进行操作,直接传递SQL语句在内部实现中也是封装成Sql类传递到底 ...

  5. using the library to generate a dynamic SELECT or DELETE statement mysqlbaits xml配置文件 与 sql构造器 对比

    https://github.com/mybatis/mybatis-dynamic-sql MyBatis Dynamic SQL     What Is This? This library is ...

  6. SpringBoot + MyBatis(注解版),常用的SQL方法

    一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...

  7. DIY:从零开始写一个 SQL 构建器

    最近在项目中遇到了一个棘手的问题,因为 EF Core 不支持直接生成 Update 语句,所以这个项目就用到了 EFCore.Plus 来实现这个功能,但是 EFCore.Plus 对 SQLite ...

  8. Awesome Go

    A curated list of awesome Go frameworks, libraries and software. Inspired by awesome-python. Contrib ...

  9. Go 语言相关的优秀框架,库及软件列表

    If you see a package or project here that is no longer maintained or is not a good fit, please submi ...

随机推荐

  1. Android MD5校验码的生成与算法实现

    在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 ...

  2. 搞不懂为什么开发人员爱iOS恨Android?

    导读:很多网站发表文章大同小异.唯有这个不同点,给大家分享. Android和iOS的较量一直都是人们津津乐道的话题.两个平台各有各的优势所在,同时也都力图能在各个方面赶超对手.对于用户来说,青菜萝卜 ...

  3. 【java】详解JDK的安装和配置

    目录结构: contents structure [+] 什么是JDK JDK的三个版本 JDK包含的主要内容 JDK的安装 JDK的配置 配置JAVA_HOME 配置PATH 到底自己需不需要配置C ...

  4. Elasticsearch与RDS比较

    Elasticsearch是一个分布式,实时,全文搜索引擎.所有操作都是通过RESTful接口实现,其底层实现是基于Lucene全文搜索引擎.数据以JSON文档的格式存储索引,不需要预先规定范式. 和 ...

  5. C++题目一道: 重载`->': 您真的懂成员访问运算符的重载吗?

    原题目在这里: http://hi.baidu.com/shilyx/item/672736e14a14a90c64db003a 要求: //给出类Test的定义和实现,使程序编译通过, //并且ma ...

  6. rdlc 分页操作和分页统计

    1. 工具箱中拖一个列表过来,设置 列表-->行组-->组属性常规-->组表达式=Int((RowNumber(Nothing)-1)/10)分页符-->勾选在组的结尾. 2. ...

  7. 设计模式之策略模式&amp;简单工厂模式

    学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...

  8. windows 中安装及使用 SSH Key

    转自 简书技术博客:https://www.jianshu.com/p/a3b4f61d4747 联系管理员开通ssh功能: 重新创建环境: 下载工具包到本地机器wsCli 0.4 解压后,把相应的w ...

  9. Python——验证码识别 Pillow + tesseract-ocr

    至于安装教程在这里不再重复说了,可以参考博客,网上有大把的教程 https://blog.csdn.net/testcs_dn/article/details/78697730 要是别的验证码是如下类 ...

  10. easyui中combobox的值改变onchang事件

    今天在公司里,那jquery中的easy-ui-里面的combobox,真的郁闷死了! 把郁闷的事情记下来,下次就不会犯错了! 首先,肯定少不了,引入jquery的js文件!请大家注意了! 下面是代码 ...