首页 > 编程知识 正文

golang命令行交互库,go语言数据库操作

时间:2023-05-06 16:52:20 阅读:274948 作者:4800

在实际的工程项目中,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,错误对象

下面是一个demo:

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"]

err此处为nil

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。