go sqlx mysql_Go sqlx库

在项目中我们通常可能会使用database/sql连接MySQL数据库。本文借助使用sqlx实现批量插入数据的例子,介绍了sqlx中可能被你忽视了的sqlx.In和DB.NamedExec方法。

sqlx介绍

在项目中我们通常可能会使用database/sql连接MySQL数据库。sqlx可以认为是Go语言内置database/sql的超集,它在优秀的内置database/sql基础上提供了一组扩展。这些扩展中除了大家常用来查询的Get(dest interface{}, ...) error和Select(dest interface{}, ...) error外还有很多其他强大的功能。

安装sqlx

基本使用

连接数据库

查询

查询单行数据示例代码如下:

查询多行数据示例代码如下:

插入、更新和删除

sqlx中的exec方法与原生sql中的exec使用基本一致:

NamedExec

DB.NamedExec方法用来绑定SQL语句与结构体或map中的同名字段。

NamedQuery

与DB.NamedExec同理,这里是支持查询。

事务操作

对于事务操作,我们可以使用sqlx中提供的db.Beginx()和tx.Exec()方法。示例代码如下:

sqlx.In

sqlx.In是sqlx提供的一个非常方便的函数。

sqlx.In的批量插入示例

表结构

为了方便演示插入数据操作,这里创建一个user表,表结构如下:

结构体

定义一个user结构体,字段通过tag与数据库中user表的列一致。

bindvars(绑定变量)

查询占位符?在内部称为bindvars(查询占位符),它非常重要。你应该始终使用它们向数据库发送值,因为它们可以防止SQL注入攻击。database/sql不尝试对查询文本进行任何验证;它与编码的参数一起按原样发送到服务器。除非驱动程序实现一个特殊的接口,否则在执行之前,查询是在服务器上准备的。因此bindvars是特定于数据库的:

MySQL中使用?

PostgreSQL使用枚举的$1、$2等bindvar语法

SQLite中?和$1的语法都支持

Oracle中使用:name的语法

bindvars的一个常见误解是,它们用来在sql语句中插入值。它们其实仅用于参数化,不允许更改SQL语句的结构。例如,使用bindvars尝试参数化列或表名将不起作用:

自己拼接语句实现批量插入

比较笨,但是很好理解。就是有多少个User就拼接多少个(?, ?)。

使用sqlx.In实现批量插入

前提是需要我们的结构体实现driver.Valuer接口:

使用sqlx.In实现批量插入代码如下:

使用NamedExec实现批量插入

注意 :该功能目前有人已经推了#285 PR,但是作者还没有发release,所以想要使用下面的方法实现批量插入需要暂时使用master分支的代码:

在项目目录下执行以下命令下载并使用master分支代码:

使用NamedExec实现批量插入的代码如下:

把上面三种方法综合起来试一下:

sqlx.In的查询示例

关于sqlx.In这里再补充一个用法,在sqlx查询语句中实现In查询和FIND_IN_SET函数。即实现SELECT * FROM user WHERE id in (3, 2, 1);和SELECT * FROM user WHERE id in (3, 2, 1) ORDER BY FIND_IN_SET(id, '3,2,1');。

in查询

查询id在给定id集合中的数据。

in查询和FIND_IN_SET函数

查询id在给定id集合的数据并维持给定id集合的顺序。

当然,在这个例子里面你也可以先使用IN查询,然后通过代码按给定的ids对查询结果进行排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值