基于gin的golang web开发:访问mysql数据库
web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动。直接使用驱动提供的API就要写很多样板代码。你可以找到很多扩展包这里介绍的是jmoiron/sqlx。另外还有一个用来处理空值的包guregu/null。
go get github.com/go-sql-driver/mysql
go get gopkg.in/guregu/null.v4
go get github.com/jmoiron/sqlx
连接数据库
jmoiron/sqlx包为database/sql
提供了很多扩展方法,例如Select可以直接把查询结果映射为结构体,不在需要对每一列进行绑定。使用jmoiron/sqlx连接数据库的方法和mysql驱动提供的方法是一样的,可以直接调用sqlx.Connect并传入连接字符串。这里使用go语言init机制初始化数据库连接。
package db
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"log"
)
var Db *sqlx.DB
func init() {
db, err := sqlx.Connect("mysql", "...?parseTime=true")
if err != nil {
log.Panicln("db err: ", err.Error())
}
db.SetMaxOpenConns(20)
db.SetMaxIdleConns(20)
Db = db
}
连接字符串中设置parseTime=true是为了解析mysql中日期时间类型。
type SysRole struct {
Id int64 `json:"id"`
Name sql.NullString `json:"name"` // 角色名
Description sql.NullString `json:"description"`
Available sql.NullInt32 `json:"available"`
CreateTime sql.NullTime `json:"create_time" db:"create_time"` // 添加时间
UpdateTime sql.NullTime `json:"update_time" db:"update_time"` // 更新时间
}
func main() {
r := gin.Default()
r.GET("/test", func(c *gin.Context) {
var sysRole []SysRole
dataSql := `
select id, name, description, available, create_time, update_time
from sys_role
`
err := db.Db.Select(&sysRole, dataSql)
if err != nil {
panic(`select sys_role err: ` + err.Error())
}
c.JSON(200, gin.H{
"data": sysRole,
})
})
r.Run(":9001")
}
在go语言中int、string之类的类型是不可以为空的,sql.NullXXX类型代表了数据库中的可空类型。还要注意一下CreateTime字段的标签,如果表的列名和结构体字段名不一样的话就要添加db标签db:"create_time"
。
访问一下接口你会发现结果可能并不是你想要的,每一个可空类型的字段都变成了对象。
{
"data": [
{
"id": 1,
"name": {
"String": "role:root",
"Valid": true
},
"description": {
"String": "超级管理员",
"Valid": true
},
"available": {
"Int32": 1,
"Valid": true
},
"create_time": {
"Time": "2020-10-25T03:13:12Z",
"Valid": true
},
"update_time": {
"Time": "2020-10-25T03:13:12Z",
"Valid": true
}
}
...
]
}
解决空值的问题
使用guregu/null包可以解决空值的问题,guregu/null为数据库和JSON提供了可空的数据类型,可以替换掉所有sql.NullXXX类型。更新后的结构体如下:
type SysRole struct {
Id int64 `json:"id"`
Name null.String `json:"name"` // 角色名
Description null.String `json:"description"`
Available null.Int `json:"available"`
CreateTime null.Time `json:"create_time" db:"create_time"` // 添加时间
UpdateTime null.Time `json:"update_time" db:"update_time"` // 更新时间
}
再次访问接口会看到熟悉的JSON结果,并且当数据为空时也能返回正确的值。
{
"data": [
{
"id": 1,
"name": "role:root",
"description": "超级管理员",
"available": 1,
"create_time": "2020-10-25T03:13:12Z",
"update_time": null
},
...
]
}
文章出处:基于gin的golang web开发:访问mysql数据库
基于gin的golang web开发:访问mysql数据库的更多相关文章
- 基于gin的golang web开发:mysql增删改查
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...
- 基于gin的golang web开发:使用数据库事务
在前文介绍访问数据库时介绍了github.com/jmoiron/sqlx包,本文基于这个包使用数据库事务. defer 在使用数据库事务之前,首先需要了解go语言的defer关键字.defer是go ...
- 基于gin的golang web开发:路由
Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...
- 基于gin的golang web开发:模型验证
Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...
- 基于gin的golang web开发:中间件
gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑.实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等 ...
- 基于gin的golang web开发:集成swagger
在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种 ...
- 基于gin的golang web开发:认证利器jwt
JSON Web Token(JWT)是一种很流行的跨域认证解决方案,JWT基于JSON可以在进行验证的同时附带身份信息,对于前后端分离项目很有帮助. eyJhbGciOiJIUzI1NiIsInR5 ...
- 基于gin的golang web开发:Gin技术拾遗
本文是对前几篇文章的一些补充,主要包含两部分:单元测试和实际项目中使用路由的小问题. 拾遗1:单元测试 Golang单元测试要求代码文件以_test结尾,单元测试方法以Test开头,参数为*testi ...
- 基于gin的golang web开发:实现用户登录
前文分别介绍过了Resty和gin-jwt两个包,Resty是一个HTTP和REST客户端,gin-jwt是一个实现了JWT的Gin中间件.本文将使用这两个包来实现一个简单的用户登录功能. 环境准备 ...
随机推荐
- Open CV leaning
刚接触Open CV 几个比较好的介绍: OpenCV学习笔记:https://blog.csdn.net/yang_xian521/column/info/opencv-manual/3 OpenC ...
- C/C++的二分查找
假设有一种温度传感器,已经测得它的电压和温度的对应关系,将电压值以ADC转换后的数字量的值表示,形成温度-AD值的对照表,如下. 大致成一条反比关系的曲线. ADC的底层驱动已经写好,对外有一个接口可 ...
- 一、Vuforia_AR
一.AR概念: 增强现实(Augmented Reality,简称AR),是一种将虚拟信息与真实世界巧妙融合的技术,广泛运用了多媒体.三维建模.实时跟踪及注册.智能交互.传感等多种技术手段,将计算机生 ...
- SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理|前后端分离(下)----筑基后期
写在前面 在上一篇文章<SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期>当中,我们初步实现了SpringBoot整合Shiro ...
- rs232转网络
rs232转网络 rs232转网络ZLAN5103可以实现RS232/485/422和TCP/IP之间进行透明数据转发.方便地使得串口设备连接到以太网和Internet,实现串口设备的网络化升级.支持 ...
- 4-20mA模拟量采集
4-20mA模拟量采集 4-20mA模拟量采集可选卓岚ZLAN6802(485)/ZLAN6842(以太网)/ZLAN6844(无线wifi)他们不仅可以可采集4~20mA还可以采集 /0~5V/0~ ...
- Python--网络爬虫模块requests模块之响应--response
当requests发送请求成功后,requests就会得到返回值,如果服务器响应正常,就会接收到响应数据: Response响应中的属性和方法 常用属性: status_code: 数据类型:int ...
- LeCun自曝使用C语言23年之久,2年前才上手Python,还曾短暂尝试Lua!
程序员圈子的流行风潮,过几年就怀旧风走一波. 这不,最近Twitter上刮起了一阵编程语言使用历史的风潮. 连图灵奖得主.CNN之父-- Yann LeCun 也参与进来了. 他自曝使用C语言时间最长 ...
- docker 启动redis/nginx
1.docker 启动redis # redis docker run -itd --name redis-test -p 16379:6379 redis 2.docker 启动nginx ...
- __getattr__和__setattr__
getattr 拦截运算(obj.xx),对没有定义的属性名和实例,会用属性名作为字符串调用这个方法 class F(object): def __init__(self): self.name = ...