GORM(一)入门之CURD

GORM 是一个强大的 ORM 库,它为 Go 开发者提供了一个简单而有效的方式来与数据库交互,全功能 ORM、预加载、Context、预编译、批量插入等各种特性,本节将从安装到基本的查询开始介绍gorm的使用

参考官方文档:https://gorm.io/zh_CN/docs/

1. GORM 的安装流程 要在 Go 项目中使用 GORM,我们首先需要安装这个包。以下是基本的安装流程:

首先,确保你安装了 Go,并设置了GOPATH。然后使用以下命令安装 GORM:

go get -u gorm.io/gorm

安装数据库驱动(以 MySQL 为例):

go get -u gorm.io/driver/mysql

在安装完 GORM 和相应的数据库驱动后,你就可以在你的 Go 项目中导入并使用它了。

2. 模型声明 GORM 使用 Go 的结构体来声明模型。这些模型与数据库中的表相对应。以下是一个简单的用户模型声明示例:

package main

import (
    "gorm.io/gorm"
)

// 定义 User 模型,它代表数据库中的 users 表
type User struct {
    gorm.Model  // 内嵌 gorm.Model 结构体,它包含了一些基础字段
    Name        string
    Age         int
    Email       string `gorm:"type:varchar(100);unique_index"`
    IsActive    bool
}

func main() {
  db, err := gorm.Open("mssql", "sqlserver://username:password@localhost:1433?database=dbname")
  defer db.Close()

   // 迁移 schema
  db.AutoMigrate(&Product{})

  // Create
  db.Create(&User{Name: "张张", Age: 18})

  // Read
  var user User
  db.First(&user, 1) // 根据整型主键查找
  db.First(&user, "age = ?", 18) // 查找 age 字段值为 18 的记录

  // update 更新
  db.Model(&user).Update("age", 20)
  // Update - 更新多个字段
  db.Model(&user).Updates(User{age: 25, Name: "丽丽"})

  // Delete - 删除
  db.Delete(&user, 1)
}

结构体标记(Tag)

结构体标记 描述
Column 指定列名
Type 指定列数据类型
Size 指定列大小, 默认值255
PRIMARY_KEY 将列指定为主键
UNIQUE 将列指定为唯一
DEFAULT 指定列默认值
PRECISION 指定列精度
NOT NULL 将列指定为非 NULL
AUTO_INCREMENT 指定列是否为自增类型
INDEX 创建具有或不带名称的索引, 如果多个索引同名则创建复合索引
UNIQUE_INDEX 和 INDEX 类似,只不过创建的是唯一索引
EMBEDDED 将结构设置为嵌入
EMBEDDED_PREFIX 设置嵌入结构的前缀
- 忽略此字段

关联相关标记(tags)

结构体标记 描述
MANY2MANY 指定连接表
FOREIGNKEY 设置外键
ASSOCIATION_FOREIGNKEY 设置关联外键
POLYMORPHIC 指定多态类型
POLYMORPHIC_VALUE 指定多态值
JOINTABLE_FOREIGNKEY 指定连接表的外键
ASSOCIATION_JOINTABLE_FOREIGNKEY 指定连接表的关联外键
SAVE_ASSOCIATIONS 是否自动完成 save 的相关操作
ASSOCIATION_AUTOUPDATE 是否自动完成 update 的相关操作
ASSOCIATION_AUTOCREATE 是否自动完成 create 的相关操作
ASSOCIATION_SAVE_REFERENCE 是否自动完成引用的 save 的相关操作
PRELOAD 是否自动完成预加载的相关操作

3. 数据库操作 创建 (Create) 要在数据库中创建一个新记录,可以使用 Create 方法:

db.Create(&User{Name: "John Doe", Age: 30, Email: "johndoe@example.com", IsActive: true})

查询 (Query) 基本查询 基本的查询可以用 Find 和 First 方法来完成:

var user User
db.First(&user)  // 查询第一条记录

var users []User
db.Find(&users)  // 查询所有记录

高级查询 使用 Where 方法进行条件查询:

var user User
db.Where("age > ?", 20).First(&user)  // 查询年龄大于 20 的第一个用户

var users []User
db.Where("name = ?", "John Doe").Find(&users)  // 查询名为 John Doe 的所有用户

还有类似laravel的FirstOrInit、FirstOrCreate、CreateInBatches、Upsert用法,具体可看官网案例说明

更新 (Update) 更新记录可以使用 Save 或者 Update 方法:

db.Model(&user).Update("Email", "newemail@example.com")  // 更新用户的 Email

db.Model(&user).Updates(User{Name: "Jane Doe", Age: 25}) // 批量更新字段

删除 (Delete) 使用 Delete 方法删除记录:

db.Delete(&user)  // 根据主键删除用户

4. 原始 SQL 和 SQL 生成器 原始 SQL 可以使用 Raw 和 Exec 方法执行原始 SQL 语句来查询或更改数据:

db.Raw("SELECT name, age FROM users WHERE name = ?", "John Doe").Scan(&user)
db.Exec("DELETE FROM users WHERE age = ?", 20)

SQL 生成器 GORM 的 SQL 生成器允许链式调用多个方法来构建 SQL:

db.Select("name", "age").Where("name = ?", "John Doe").Find(&user)

钩子函数 HOOK gorm提供了BeforeSave, BeforeCreate, AfterSave, AfterCreate三种类型的钩子函数,分别代表保存前、创建前、保存后、创建后的动作。比如创建前:

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
  u.UUID = uuid.New()

    if u.Role == "admin" {
        return errors.New("invalid role")
    }
    return nil
}

打 赏