go 用 mysql web开发_基于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

},

...

]

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值