Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动。标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx

go get github.com/jmoiron/sqlx
go get github.com/go-sql-driver/mysql

连接数据库

db, err := sqlx.Connect("mysql", "...?parseTime=true")
if err != nil {
log.Panicln("db err: ", err.Error())
}

使用sqlx的Connect方法连接数据库,Connect自动确认是否连接成功,如果出错的话err返回错误信息。可以在需要连接数据库的函数中直接连接,也可以使用基于gin的golang web开发:访问mysql数据库中介绍的go语言init机制获取连接。

增删改

mysql的增删改使用db的Exec函数,传入sql语句和查询参数。sqlx也提供了MustExec函数,在sql语句执行出错的时候触发panic而不是返回error。

db, err := sqlx.Connect("mysql", "...?parseTime=true")
if err != nil {
log.Panicln("db err: ", err.Error())
}
defer db.Close() insertSql := `
INSERT INTO sys_user (
username,
PASSWORD
)
VALUES
(?, ?);
`
result, err := db.Db.Exec(insertSql, username, password)
if err != nil {
log.Panicln("add user err: ", err.Error())
} updateSql := `
update sys_user
set username = ?
where id = ?;
`
result1, err1 := db.Db.Exec(updateSql, username, id)
if err1 != nil {
log.Panicln("update user by id err: ", err.Error())
} deleteSql := `
delete from sys_user
where id = ?
`
result2, err2 := db.Db.Exec(deleteSql, id)
if err2 != nil {
log.Panicln("delete user by id err: ", err.Error())
}

Exec函数的结果result接口包含两个函数LastInsertId,RowsAffected,可以判断RowsAffected > 0来验证sql语句的执行结果。注意RowsAffected不是所有数据库和驱动都支持,如果你用的不是mysql的话需要检查你的环境是否支持RowsAffected。

sqlx支持可以方便把数据库查询结果转换成go结构体,Get和Select分别用来获取单个结果和多个结果。

type SysUser struct {
Id int `json:"id"`
Username null.String `json:"username"`
Password null.String `json:"password"` // 登录密码
} func GetAllUser(request GetAllUserRequest) (list []SysUser) {
strSql := `
select id,
username,
password
from sys_user
`
err = db.Db.Select(&list, strSql)
if err != nil {
log.Panicln("select sys_user err: ", err.Error())
} return
} func GetById(id int) (user SysUser) {
sysUser := SysUser{}
dataSql := `
select id,
username,
password
from sys_user
where id = ?
`
err := db.Db.Get(&sysUser, dataSql, id)
if err != nil {
log.Panicln("get user by id err: ", err.Error())
}
return sysUser
}

Select方法获取所有结果放入内存,并转换为目标结构体,如果结果中包含大量数据的话可以分页返回,也可以使用Query/StructScan迭代方法。

文章出处:基于gin的golang web开发:mysql增删改查

基于gin的golang web开发:mysql增删改查的更多相关文章

  1. 基于gin的golang web开发:访问mysql数据库

    web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动.直接使用驱动提供的API就要写很多样板代码.你可以找到很多扩展包这里介绍的是jmoiron/sqlx.另外还有 ...

  2. 基于gin的golang web开发:路由

    Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...

  3. 基于gin的golang web开发:路由二

    在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...

  4. 基于gin的golang web开发:模型绑定

    在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...

  5. 基于gin的golang web开发:模型验证

    Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...

  6. 基于gin的golang web开发:使用数据库事务

    在前文介绍访问数据库时介绍了github.com/jmoiron/sqlx包,本文基于这个包使用数据库事务. defer 在使用数据库事务之前,首先需要了解go语言的defer关键字.defer是go ...

  7. 基于gin的golang web开发:中间件

    gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑.实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等 ...

  8. 基于gin的golang web开发:集成swagger

    在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种 ...

  9. 基于gin的golang web开发:永远不要相信用户的输入

    作为后端开发者我们要记住一句话:"永远不要相信用户的输入",这里所说的用户可能是人,也可能是另一个应用程序."永远不要相信用户的输入"是安全编码的准则,也就是说 ...

随机推荐

  1. ConcurrentHashMap原理分析(一)-综述

    概述 ConcurrentHashMap,一个线程安全的高性能集合,存储结构和HashMap一样,都是采用数组进行分桶,之后再每个桶中挂一个链表,当链表长度大于8的时候转为红黑树,其实现线程安全的基本 ...

  2. c 判断端口是否已被使用

    isPortOpen.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...

  3. dockerfile构建Tomcat镜像

    dockerfile构建Tomcat镜像 一.镜像分层概念 二.制作tomcat镜像 2.1.创建分层目录 [root@node2 ~]# mkdir /app/{web/{nginx,tomcat, ...

  4. 在linux下搭建l2tp隧道

    搭一个l2tp隧道,拓扑如下 两台机器是CentOS5,内核选上CONFIG_LEGACY_PTYS选项后自己编译的,l2tp是已经停更的l2tpd-0.69.先在LS上配置IP地址,iptables ...

  5. python 不定长参数

    1 #不定长参数 * 元祖 ** 字典 2 def item(a,b,*c,**d): 3 print(a) 4 print(b) 5 print(c) 6 print(d) 7 8 item(11, ...

  6. 双栈排序(洛谷P1155)二分图的判定+思维贪心

    题目:戳这里 题目大意: 给你一个数列,问能否通过两个栈的push与pop把它输出成一个升序序列(每个数只能入队并出队一次) 不能的话输出0,能的话输出操作方法 主要思路: 1.判断是否可以成功输出升 ...

  7. linux查看登录用户

    [root@localhost ~]# w 11:01:06 up 3 days, 12:40, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FRO ...

  8. solr之functionQuery(函数查询)【转】

    函数查询 让我们可以利用 numeric域的值 或者 与域相关的的某个特定的值的函数,来对文档进行评分. 怎样使用函数查询 这里主要有两种方法可以使用函数查询,这两种方法都是通过solr http 接 ...

  9. 立即执行函数 - Js函数笔记

    立即执行函数 定义:此类函数没有声明,在执行一次后即释放,适合做初始化. 针对初始化功能的函数,同时遵循一句话,只有表达式才能被执行符号执行 1.(function() {...}()); - W3C ...

  10. 「IDEA插件精选」安利一个IDEA骚操作:一键生成方法的序列图

    在平时的学习/工作中,我们会经常面临如下场景: 阅读别人的代码 阅读框架源码 阅读自己很久之前写的代码. 千万不要觉得工作就是单纯写代码,实际工作中,你会发现你的大部分时间实际都花在了阅读和理解已有代 ...