什么是 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.Scanner 及 driver.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 提供了 First、Take、Last 方法,以便从数据库中检索单个对象。
var student Student
db.First(&student, 1) // 根据整形主键查找
db.First(&student, "age = ?", "22") // 查找 age 字段值为 22 的记录
更新
db.Model(&student).Update("age", 23)
删除
db.Delete(&student, 1)