go get github.com/go-sql-driver/mysql
go get gopkg.in/guregu/null.v4
go get github.com/jmoiron/sqlx
连接数据库
database/sql
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")
}
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
},
...
]
}