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

  1. go get github.com/go-sql-driver/mysql
  2. go get gopkg.in/guregu/null.v4
  3. go get github.com/jmoiron/sqlx

jmoiron/sqlx包为database/sql提供了很多扩展方法,例如Select可以直接把查询结果映射为结构体,不在需要对每一列进行绑定。使用jmoiron/sqlx连接数据库的方法和mysql驱动提供的方法是一样的,可以直接调用sqlx.Connect并传入连接字符串。这里使用go语言init机制初始化数据库连接。

  1. package db
  2. import (
  3. _ "github.com/go-sql-driver/mysql"
  4. "github.com/jmoiron/sqlx"
  5. "log"
  6. )
  7. var Db *sqlx.DB
  8. func init() {
  9. db, err := sqlx.Connect("mysql", "...?parseTime=true")
  10. if err != nil {
  11. log.Panicln("db err: ", err.Error())
  12. }
  13. db.SetMaxOpenConns(20)
  14. db.SetMaxIdleConns(20)
  15. Db = db
  16. }

连接字符串中设置parseTime=true是为了解析mysql中日期时间类型。

  1. type SysRole struct {
  2. Id int64 `json:"id"`
  3. Name sql.NullString `json:"name"` // 角色名
  4. Description sql.NullString `json:"description"`
  5. Available sql.NullInt32 `json:"available"`
  6. CreateTime sql.NullTime `json:"create_time" db:"create_time"` // 添加时间
  7. UpdateTime sql.NullTime `json:"update_time" db:"update_time"` // 更新时间
  8. }
  9. func main() {
  10. r := gin.Default()
  11. r.GET("/test", func(c *gin.Context) {
  12. var sysRole []SysRole
  13. dataSql := `
  14. select id, name, description, available, create_time, update_time
  15. from sys_role
  16. `
  17. err := db.Db.Select(&sysRole, dataSql)
  18. if err != nil {
  19. panic(`select sys_role err: ` + err.Error())
  20. }
  21. c.JSON(200, gin.H{
  22. "data": sysRole,
  23. })
  24. })
  25. r.Run(":9001")
  26. }

在go语言中int、string之类的类型是不可以为空的,sql.NullXXX类型代表了数据库中的可空类型。还要注意一下CreateTime字段的标签,如果表的列名和结构体字段名不一样的话就要添加db标签db:"create_time"

访问一下接口你会发现结果可能并不是你想要的,每一个可空类型的字段都变成了对象。

  1. {
  2. "data": [
  3. {
  4. "id": 1,
  5. "name": {
  6. "String": "role:root",
  7. "Valid": true
  8. },
  9. "description": {
  10. "String": "超级管理员",
  11. "Valid": true
  12. },
  13. "available": {
  14. "Int32": 1,
  15. "Valid": true
  16. },
  17. "create_time": {
  18. "Time": "2020-10-25T03:13:12Z",
  19. "Valid": true
  20. },
  21. "update_time": {
  22. "Time": "2020-10-25T03:13:12Z",
  23. "Valid": true
  24. }
  25. }
  26. ...
  27. ]
  28. }

使用guregu/null包可以解决空值的问题,guregu/null为数据库和JSON提供了可空的数据类型,可以替换掉所有sql.NullXXX类型。更新后的结构体如下:

  1. type SysRole struct {
  2. Id int64 `json:"id"`
  3. Name null.String `json:"name"` // 角色名
  4. Description null.String `json:"description"`
  5. Available null.Int `json:"available"`
  6. CreateTime null.Time `json:"create_time" db:"create_time"` // 添加时间
  7. UpdateTime null.Time `json:"update_time" db:"update_time"` // 更新时间
  8. }

再次访问接口会看到熟悉的JSON结果,并且当数据为空时也能返回正确的值。

  1. {
  2. "data": [
  3. {
  4. "id": 1,
  5. "name": "role:root",
  6. "description": "超级管理员",
  7. "available": 1,
  8. "create_time": "2020-10-25T03:13:12Z",
  9. "update_time": null
  10. },
  11. ...
  12. ]
  13. }

文章出处:基于gin的golang web开发:访问mysql数据库

版权声明:本文为huaface原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/huaface/p/13936477.html