Gorm入门 | 青训营笔记

178 阅读2分钟

什么是 ORM ?

ORM (Object Relational Mapping) 即对象关系映射,是一种程序设计技术。其中对象指的是面向对象编程中某个类的实例,而在 Go 中则为结构体;关系指的是关系型数据库,如 MySQL;映射则是将程序中的对象存储到数据库中,通常程序一旦退出,其定义并存放在内存中的对象也随之消失,因此,通过 ORM 技术可以将对象持久化地存储到硬盘中。

Gorm 连接 MySQL 数据库

1. 配置 DSN(Data Source Name)

dsn 即数据源名称,简单来说就是一个包含了数据库地址、数据库账号、数据库密码、数据库名等信息字符串,用于打开对应的数据库。

示例如下: root: password@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local&timeout=10s

dsn 的详细规则可参考这里

2. 简单连接

package main  
  
import (  
   "fmt"  
   "gorm.io/driver/mysql"   "gorm.io/gorm")  
  
func main() {  
   username := "root"     //账号  
   password := "password" //密码  
   host := "127.0.0.1"    //数据库地址,可以是Ip或者域名  
   port := 3306           //数据库端口  
   Dbname := "gorm"       //数据库名  
   timeout := "10s"       //连接超时,10秒  
  
   dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)  
   db, err := gorm.Open(mysql.Open(dsn))  
   if err != nil {  
      panic("连接数据库失败, error=" + err.Error())  
   }  
   fmt.Println(db)  
}

GORM Model 定义

在使用 Gorm 时,我们需要在代码中定义 Model 与数据库中的数据表进行映射。Model 就是 Go 的结构体,由 Go 的基本数据类型或它们的指针组成,还支持 sql.Scannerdriver.Valuer 接口。

type Student struct {  
   ID   uint  // 默认使用ID作为主键  
   Name string  
   Age  uint  
}

定义表名

表名默认是结构体名称的复数,上述定义的 Student 结构体对应的表名为 students

也可以通过定义结构体方法并返回表名的方式来自定义表名:

func (Student) TableName() string {
  return "stu"
}

Student 类型的数据传给 Gorm 时,Gorm 会调用其 TableName 方法。

定义列名

默认的列名为字段名称,以 _ 进行分割:

type Student struct {  
   ID         uint   // column name: id  
   Name       string // column name: name  
   Age        uint   // column name: age  
   totalScore uint   // column name: total_score  
}

也可以使用结构体 tag 定义列名:

type Student struct {  
   ID         uint   `gorm:"column:stu_id"`  
   Name       string `gorm:"column:stu_name"`  
   Age        uint   `gorm:"column:stu_age"`  
   totalScore uint   `gorm:"column:stu_score"`  
}

CURD

创建

使用 Create 函数并传入结构体指针

db.Create(&Student{ID: 2023, Name: "Godzilla", Age: 22, totalScore: 290})

查询

GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。

var student Student
db.First(&student, 1) // 根据整形主键查找
db.First(&student, "age = ?", "22") // 查找 age 字段值为 22 的记录

更新

db.Model(&student).Update("age", 23)

删除

db.Delete(&student, 1)