Gorm的使用 | 豆包MarsCode AI 刷题

164 阅读3分钟

gorm

概述:

Gorm 是一个 Go 语言编写的 ORM库,全称为 Go Object - Relational Mapping。它提供了一种方便的方式来将 Go 语言中的结构体和数据库中的表进行映射,使得开发者可以使用面向对象的方式来操作数据库,而无需编写大量的 SQL 语句。

说明:我们就来使用Mysql作为本次的数据库,通过对user_info表的增删改查来讲解。下面是表的创建:

CREATE TABLE user_info (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    age INT
);

1、连接数据库:

我们要知道我们的数据库配置文件

eg:"username:password@tcp(hostname:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

username:

数据库连接的用户名

password:

数据库连接的密码

hostname:

数据库连接的主机地址,通常默认为127.0.0.1

port:

数据库连接的端口号,通常默认为3306

dbname:

这是我们要连接的数据库名

其他:

就是我们的编码格式以及其他配置信息

  • 在连接数据库之前,我们首先要安装两个数据库相关的包:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

我们只需要在对应Go文件命令行输入,然后回车即可

  • 下面我们要创建一个数据库初始化,用于连接我们的数据库。命名为MySqlUtil.go

    • 使用gorm.Open方法建立与数据库的连接
    • 将连接的数据库赋值给DB变量
     type mySqlUtil struct {
      DB *gorm.DB
    }
     
    //全局变量, 外部使用utils.MySqlClient来访问
    var MySqlClient mySqlUtil
     
    func InitMySqlUtil() error {
      dsn := "username:password@tcp(hostname:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
      dd, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
      if err != nil {
        panic("[SetupDefaultDatabase#newConnection error]: " + err.Error() + " " + dsn)
      }
      sqlDB, err := dd.DB()
      if err != nil {
        panic("[SetupDefaultDatabase#newConnection error]: " + err.Error() + " " + dsn)
      }
      //初始化全局redis结构体
      MySqlClient = mySqlUtil{DB: dd}
      return nil
    }
    ​
    
  • 创建一个与数据库相对应的表结构

    package models
    //数据库表结构
    type UserInfo struct {
      Id   int    `gorm:"primaryKey;autoIncrement" form:"id"`
      Name string `form:"name"`
      Age  int    `form:"age"`
    }
     
    // 自定义表名(和数据库一样)
    func (UserInfo) TableName() string {
      return "user_info"
    }
    
  • 我们创建一个用户增删改查的“类”:

    • UpdateUserName :UPDATE user_info SET name = '具体的name值' WHERE id = '具体的id值';

    • GetUserPageList:SELECT * FROM user_info WHERE age < 20 LIMIT size OFFSET index * size;

      这里我们就写出了两种方法(更新和查找),剩下的两种与其相似;

type UserInfoDao struct {
}
​
var UserInfo = UserInfoDao{}
​
// Model() 方法主要用于指定后续数据库操作所针对的模型(通常是一个结构体,该结构体与数据库表结构有对应关系)
func (UserInfoDao) UpdateUserName(name string, id int) error {
  err := utils.MysqlClient.DB.Model(&models.UserInfo{}).Where("id = ?", id).Update("name", name).Error
  return err
}
​
func (UserInfoDao) GetUserPageList(index int, size int) ([]models.UserInfo, error) {
  results := make([]models.UserInfo, 0)
  err := utils.MysqlClient.DB.Model(&models.UserInfo{}).Where("age < ?", 20).Limit(size).Offset(index * size).Find(&results).Error
  return results, err
}
  • 创建好之后,我们就可以就可以在main.go中去初始化我们的数据库:

    • 我们使用gin.Default()创建了一个server
    • 端口号为9090
    func main() {
    ​
      utils.InitMySqlUtil()
      
      //创建一个默认的路由引擎
      engine := gin.Default()
      routers.RegisterRouter(engine)
      engine.Run(":9090")
    }
    
  • 下面,我们就可以在controller中去调用对应的方法:

    type UserController struct {
    }
    ​
    // 分页查询
    func (controller *UserController) GetPageList(context *gin.Context) {
      index, _ := strconv.Atoi(context.Query("index"))
      println("index:", index)
      size, _ := strconv.Atoi(context.Query("size"))     
      list, _ := dao.UserInfo.GetUserPageList(index, size)
      context.JSON(http.StatusOK, gin.H{
        "users": list,
      })
    }
     
    // 根据id更新name
    func (controller *UserController) UpdateUserName(context *gin.Context) {
      name := context.PostForm("name")
      println("name:", name)
      id, _ := strconv.Atoi(context.PostForm("id"))
      _ = dao.UserInfo.UpdateUserName(name, id)
      context.JSON(http.StatusOK, gin.H{
        "code": 1,
      })
    }
    

    以上就是Gorm的全部内容,如果代码有看不懂的地方,或者不知道另外两种方法不知道如何去写,我们可以去豆包MarsCode进行提问,豆包MarsCode讲给你一个更加详细的讲解;