xorm的sql builder
最近在使用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的更多相关文章
- SQL Builder 1.04
		
解析效果: select id,code,name,utime,src,ctime from stock where id<20 and code like '%6%' order by id, ...
 - MyBatis(3.2.3) - Dynamic SQL
		
Sometimes, static SQL queries may not be sufficient for application requirements. We may have to bui ...
 - 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)
		
该篇是 Grissom.CMS 框架系列文章的第三篇, 主要介绍框架用到的核心库 EasyJsonToSql, 把标准的配置文件和数据结构解析成可执行的 sql. 该框架能实现自动化增删改查得益于 E ...
 - PetaPoco源代码学习--3.Sql类
		
PetaPoco对数据库的操作直接使用SQL语句,在代码中进行调用既可以直接传递SQL语句,也可以使用提供的SQL类来获取到SQL语句进行操作,直接传递SQL语句在内部实现中也是封装成Sql类传递到底 ...
 - 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 ...
 - SpringBoot + MyBatis(注解版),常用的SQL方法
		
一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...
 - DIY:从零开始写一个 SQL 构建器
		
最近在项目中遇到了一个棘手的问题,因为 EF Core 不支持直接生成 Update 语句,所以这个项目就用到了 EFCore.Plus 来实现这个功能,但是 EFCore.Plus 对 SQLite ...
 - Awesome Go
		
A curated list of awesome Go frameworks, libraries and software. Inspired by awesome-python. Contrib ...
 - Go 语言相关的优秀框架,库及软件列表
		
If you see a package or project here that is no longer maintained or is not a good fit, please submi ...
 
随机推荐
- 六款值得推荐的Android开源框架简介
			
技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的“性价比”比较高的Android开源框架,应该是相对实用的. 1.volley 项目地址 https://github.com/smanik ...
 - 【MySQL】MySQL存储过程介绍
			
目录结构: contents structure [-] 存储过程简介 关于MySQL的存储过程 MySQL存储过程的创建 格式 声明分割符 参数 变量 注释 MySQL存储过程的调用 MySQL存储 ...
 - centos 为OPENJDK配置JAVA_HOME环境变量,安装MAVEN
			
1.安装开发者工具包 yum install java--openjdk-devel -y 2.配置环境变量 vim /etc/profile export JAVA_HOME=/usr/lib/jv ...
 - SQL plan directives
			
SQL plan directives SQL plan directives含有优化器产生优化的执行计划时需要的附加信息和指令. 在sql执行时,如果cardinality估计有错误,数据库就会创建 ...
 - freeswitch订阅会议相关通知
			
一. freeswitch订阅会议相关通知 event plain CUSTOM conference::maintenance 这时会收到各种通知,会议创建.成员加入.成员离开.成员开始讲话,成员停 ...
 - C#中关于DataGridView行和列的背景色-前景色设置
			
关于DataGridView行和列的背景色-前景色设置 1.设定DataGridView全部单元格的Style DataGridView内所有单元格的Style变更,可以使用DataGridView ...
 - 验证码识别  图像降噪  Python (一)
			
原始图片: 降噪后的图片 实现代码: # coding:utf-8 import sys, os from PIL import Image, ImageDraw # 二值数组 t2val = {} ...
 - Maven 使用国内镜像
			
1 修改maven 的配置文件 settings.xml,添加阿里云的一个中央仓库. 2 找到maven 的配置文件,一般在 maven 安装目录 apache-maven-3.5.0\conf 文件 ...
 - WPF中动态改变控件显示位置
			
转自 http://blog.csdn.net/lassewang/article/details/6928897 测试环境: Windows XP/Windows 7 开发环境: Microsoft ...
 - 手把手教你使用“谷歌云消息服务(GCM)"
			
原文: http://android.eoe.cn/topic/summary GCM结构概述-GCM Architectural Overview 快速预览* 一个状态通知允许应用程序通知用户一个事 ...