GORM使用笔记 | 青训营笔记

54 阅读4分钟

GORM

这篇笔记用来记录自己对GORM上手使用的过程。接下来将分以下几个部分来记录:

一、连接数据库。

二、模型的定义。

三、CRUD操作。

一、连接数据库

在编写代码使用GORM连接数据库之前,首先确保电脑上已经安装配置好了对应的数据库。

在这里以MySQL为例演示连接数据库。

首先,我们需要导入用到的库,包括"gorm.io/driver/mysql""gorm.io/gorm"

若使用Goland等IDE,IDE会帮助我们自动完成库的下载,若自己手动导入,需要使用go get命令进行下载。

接下来,我们编写init()函数,在函数体中实现数据库的连接。该函数会在所有程序执行开始前被调用,每个包可以包含多个init()函数,所有被编辑器识别到的init函数都会在main函数执行前被调用。通常这个函数被用来注册一个程序需要使用的依赖,如mysql注册,配置文件加载等,正好适合我们对数据库进行连接。

在函数体中,我们先将连接数据库需要的配置进行声明,包括账号,密码,数据库地址,端口号,数据库名,连接超时时间等信息。接下来将这些配置信息通过格式化字符串的方式拼接为对应的dsn(data-source-name)。

然后使用mysql.Open(dsn)完成连接,并传递给gorm.Open()函数,获得DB类型的实例,用于后续数据库的CRUD操作。

此外也应当进行异常处理,若连接失败应该抛出一个panic并打印错误信息。

基于上述过程,示例代码如下:

 package main
 import (
 "fmt"
 "gorm.io/driver/mysql"
 "gorm.io/gorm"
 )
 // 定义一个全局变量db
 var DB *gorm.DB
 //使用init函数,在主函数前进行初始化
 func init() {
     username := "root"       //账号
     password := "password"   //密码
     host := "127.0.0.1"             //数据库地址
     port := "3306"           //端口
     Dnname := "myemployees"       //数据库名
     timeout := "10s"         //连接超时,10s
     dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?timeout=%s", username, password, host, port, Dnname, timeout)
     //连接mysql,获得DB类型实例,用于后面数据库的读写操作
     db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
     if err != nil {
         panic(any("连接数据库失败,error=" + err.Error()))
     }
     DB = db
     //连接成功
     fmt.Println("连接数据库成功")
 }
 ​
 func main() {
 }
 ​

image.png

二、模型的定义

GORM 通过将 Go 结构体(Go structs) 映射到数据库表来简化数据库交互。 了解如何在GORM中定义模型,是充分利用GORM全部功能的基础。

这里尝试GORM官方文档中提供的案例,创建一个user模型。

 type User struct {
   ID           uint           // 主键
   Name         string         // 一个常规字符串字段
   Email        *string        // 一个指向字符串的指针,允许空值
   Age          uint8          // 一个未签名的8位整数
   Birthday     *time.Time     // 一个指向Time的指针,允许空值
   MemberNumber sql.NullString // Uses sql.NullString to handle nullable strings
   ActivatedAt  sql.NullTime   // Uses sql.NullTime for nullable time fields
   CreatedAt    time.Time      // 创建时间(由GORM自动管理)
   UpdatedAt    time.Time      // 最后一次更新时间(由GORM自动管理)
 }

在此模型中:

  • 具体数字类型如 uintstringuint8 直接使用。
  • 指向 *string*time.Time 类型的指针表示可空字段。
  • 来自 database/sql 包的 sql.NullStringsql.NullTime 用于具有更多控制的可空字段。
  • CreatedAtUpdatedAt 是特殊字段,当记录被创建或更新时,GORM 会自动向内填充当前时间。

此外,GORM还为模型的字段提供了更多高级选项,包括字段级权限控制,创建/更新时间追踪,字段标签等,这些高级选项在实际使用中也非常实用,详情参考官方文档

三、CRUD操作

创建表

使用db.AutoMigrate()来创建表,将上述定义的user模型的引用作为参数传入,即可完成表的创建。

 func main() {
     err := db.AutoMigrate(&User{})
     if err != nil {
         panic(any("表创建失败:"+err.Error()))
     }
     fmt.Println("表创建成功")
 }

image.png

image.png

由上图可以看到我们的users表已经成功创建。

创建记录(Create)

使用db.Create()方法,通过数据的指针进行创建,也可以一次创建多条记录,我们在下面的代码中一次创建两条user。

 users := []*User{
     {Name: "zhangsan", Age: 18, Birthday: time.Now()},
     {Name: "lisi", Age: 19, Birthday: time.Now()},
 }
 result := db.Create(users) 
 fmt.Println(result.Error)       //打印错误
 fmt.Println(result.RowsAffected)   //打印创建记录的条数

image.png

image.png

如图所示,已经成功完成了两条记录的插入。

查询记录(Read)

GORM提供了很多种查询方式,这里尝试一些基本的查询。

1.查询一条记录

 var user User
 result := db.First(&user)   //查询第一条记录(主键升序)
 //result := db.Take(&user)  //查询一条记录,不指定排序
 //result := db.Last(&user)  //查询最后一条记录(主键降序)
 fmt.Println(result.Error)       
 fmt.Println(result.RowsAffected) 
 fmt.Println(user)

image.png

2.条件查询

主要使用db.Where(条件).Find()方法。下面是一个示例,查询年龄在18岁到24岁之间的用户,并且将用户名和年龄打印输出:

 var users []User
 results := db.Where("age < ? AND age >= ?", "24", "18").Find(&users)
 fmt.Println(results.RowsAffected)
 for _,usr := range users{
     fmt.Println(usr.Name+" "+strconv.FormatUint(uint64(usr.Age), 10))
 }

image.png