文档章节

Golang数据库操纵对IN语句的支持

o
 osc_zoa3moe9
发布于 2019/12/07 21:06
字数 599
阅读 61
收藏 0

精选30+云产品,助力企业轻松上云!>>>

一:

在实际的工程项目中,SQL通常使用预编译的形式进行执行操纵,可以有效的防止SQL注入的风险,提高编码的规范性。
golang中使用sqlx进行sql查询的时候,在使用in语句在一个集合中查询的时候,若使用预编译形式则通常有两种形式:
方法一:
使用语言的for语句循环生成SQL语句中的“?”,类似这样:

list:=[]int{1,2,4,66}
sql:="select * from books where book_id IN (%s)"
inStatus:=""
params:=make([]interface{},0)
for i:=0;i<len(list);i++{
    if i==0{
        inStatus+="?"
    }else{
        inStatus+=",?"
    }
    params=append(params , list[i])
}
sql = fmt.Sprintf(sql ,inStatus )
db.Exec(sql , params...)

 

方法二:
其实sqlx内置了一个In()方法用于处理这种情况,可以使得对in的处理十分优雅。
其实该方法的实现和我们方法一的处理原理类似。

// In expands slice values in args, returning the modified query string
// and a new arg list that can be executed by a database. The `query` should
// use the `?` bindVar.  The return value uses the `?` bindVar.

func In(query string, args ...interface{}) (string, []interface{}, error)

输入的参数query是一个sql语句,其中的需要使用In list的地方使用(?)代替,args为按照前后顺序的查询参数,按照实际对应?的次序的若干个参数。返回值有三个:
第一个,string,是处理完后的sql语句,其中的In查询语句中的一个?已经按照实际的list长度进行处理,替换为多个“?”
第二个,[]interface{},查询参数列表,
第三个,error,错误对象

bookList:=make([]Book , 0)
sql := "SELECT * FROM books where book_id IN (?) AND status != ? ORDER BY create_time DESC"
ids:=[]int{122,211,110}
sql, args, err := sqlx.In(sql, ids, model.StatusSelfDeleted) //model.StatusSelfDeleted="DELETED"
if err != nil {
    return bookList
}
err = db.Select(&bookList, sql, args...) //db为*sqlx.DB类型

其中sqlx.In函数返回的sql如下:

SELECT * FROM books where book_id IN (?,?,?) AND status != ? ORDER BY create_time DESC

args为:

[122,211,110,"DELETED"]

 

二:

如果的数组中有两个int,构建它:

SELECT some_column
FROM table_name
WHERE id IN (?, ?)

如果你有四个,构建:

SELECT some_column
FROM table_name
WHERE id IN (?, ?, ?, ?)

等等。你需要的是一个简单的函数,可以产生n占位符; 有很多方法可以做到这一点:

func placeholders(n int) string {
    ps := make([]string, n)
    for i := 0; i < n; i++ {
        ps[i] = "?"
    }
    return strings.Join(ps, ",")
}

或者:

func placeholders(n int) string {
    var b strings.Builder
    for i := 0; i < n - 1; i++ {
        b.WriteString("?,")
    }
    if n > 0 {
        b.WriteString("?")
    }
    return b.String()
}
uery := fmt.Sprintf("select some_column from table_name where id in (%s)", placeholders(len(idsToGet)))
rows, err := db.Query(query, idsToGet...)

 

o
粉丝 1
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
开源分布式图数据库 Nebula Graph 1.0 发布

Nebula Graph 1.0 发布了。作为一款开源分布式图数据库,Nebula Graph 1.0 版本旨在提供一个安全、高可用、高性能、具有强表达能力的查询语言的图数据库。 基本功能 DDL & DML:支持在线的数...

NebulaGraph
06/11
2.1K
14
笔记-2:mysql编程语言

1.结构化查询语言:SQL SQL(结构化查询语言)是一种专门用来与数据库通信的语言。SQL由不同的关键字构成,每个SQL语句都是一个或多个关键字构成的。 SQL具有的优点: SQL不是某个特定数据库供...

osc_ujeqpb4c
2019/08/15
0
0
MyBatis知多少(2)

MyBatis从目前最流行的关系数据库访问方法中吸收了大量的优秀特征和思想,并找出其中的协同增效作用。下图展示了MyBatis框架是如何吸收我们在多年使用不同方式进行数据库集成的 开发过程中所...

Coda
2015/07/09
0
0
Nebula Graph 1.0 Release Note

Nebula Graph 1.0 发布了。作为一款开源分布式图数据库,Nebula Graph 1.0 版本旨在提供一个安全、高可用、高性能、具有强表达能力的查询语言的图数据库。 首发于 Nebula Graph 官方博客:h...

NebulaGraph
06/11
28
0
[转帖]golang操作mysql使用总结

golang操作mysql使用总结 https://www.cnblogs.com/hanyouchun/讲解的很详细~ 前言 Golang 提供了包用于对的访问, 作为操作数据库的入口对象, 主要为我们提供了两个重要的功能: sql.DB 通过数...

osc_918p5b67
2019/04/19
17
0

没有更多内容

加载失败,请刷新页面

加载更多

博客园二次元主题——Sakura

碎碎念 嗯,时隔多久也记不清了,我又回来了,总算是忙里偷闲把这篇文章写出来,有人要过很多次我的博客园美化方案,但是实在是忙啊,也因为我的前台技术不好,代码bug很多,所以也有点不想把...

osc_2y6i16fz
56分钟前
19
0
highcharts 自适应div的宽度

如果窗口变化时,highcharts图表是自带自适应的,但是切换折叠菜单时,highchats图表并不自适应外层div的宽度。如何实现适应div的宽度? 在网上找到有个 reflow 的方法,我是在项目中引入的 ...

tianyawhl
56分钟前
23
0
个人作业——软件工程实践总结&个人技术博客

这个作业属于哪个课程 2020春|S班 (福州大学) 这个作业要求在哪里 个人作业——软件工程实践总结&个人技术博客 这个作业的目标 回顾这门课程带来的提升、团队总结、实践中的经验总结、对下届...

osc_g032zryv
58分钟前
17
0
从封装变化的角度看设计模式——对象创建

封装变化之对象创建 在对象创建的过程中,经常会出现的一个问题就是通过显示地指定一个类来创建对象,从而导致紧耦合。这是因为创建对象时指定类名将使你受特定实现的约束而不是特定接口的约...

osc_r5t7sskd
58分钟前
19
0
从封装变化的角度看设计模式——对象创建

封装变化之对象创建 在对象创建的过程中,经常会出现的一个问题就是通过显示地指定一个类来创建对象,从而导致紧耦合。这是因为创建对象时指定类名将使你受特定实现的约束而不是特定接口的约...

osc_i5oyb1xr
59分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部