Gorm学习笔记 | 青训营

103 阅读3分钟

1. 安装 GORM

使用 Go 的模块管理工具来安装 GORM:

go get -u gorm.io/gorm

2. 连接数据库

在使用 GORM 之前,首先要连接到数据库。这里以 MySQL 数据库为例:

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("Failed to connect to database")
    }
    defer db.Close()
}

注意:

  • 此处的 db 即为已连接的数据库实例
  • dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"处需要修改,user换成mysql的账号,password换成mysql密码,dbname换成数据库名字

3. 定义模型

使用 GORM,可以通过定义 Go 结构体来映射数据库表:

type User struct {
    gorm.Model
    Name     string
    Email    string
    Age      int
}

4. 迁移(数据库表的创建)

迁移是将定义的 Go 结构体映射到数据库表的过程:

func main() {
    // ... 连接数据库的代码 ...

    // 创建表
    db.AutoMigrate(&User{})
}

注意:

  • 这里生成的表与结构体的名字有关联关系,例如结构体名字叫User,生成的表格名字叫Users

5. 基本的 CRUD 操作

  • 创建记录:
newUser := User{Name: "Alice", Email: "alice@example.com", Age: 25}
db.Create(&newUser)
  • 查询记录:
var user User
db.First(&user, 1) // 通过主键查询第一条记录
db.Where("email = ?", "alice@example.com").First(&user) // 条件查询

注意: db.Where("email = ?", "alice@example.com").First(&user) 表示查找数据库中第一个具有邮箱地址为 "alice@example.com" 的记录

  • 更新记录:
db.Model(&user).Update("Age", 26)
  • 删除记录:
db.Delete(&user)

6. 关联关系

GORM 提供了多种关联关系的处理方法,如一对一、一对多、多对多等。以一对多关系为例:

type User struct {
    gorm.Model
    Name     string
    Email    string
    Age      int
    Articles []Article // 一个用户有多篇文章
}

type Article struct {
    gorm.Model
    Title    string
    Content  string
    UserID   uint
}

7. 查询预加载

在查询关联数据时,可以使用预加载功能以减少查询次数:

var user User
db.Preload("Articles").First(&user, 1) // 预加载用户的文章

8. 事务

GORM 支持事务操作,以保证数据的完整性和一致性:

tx := db.Begin()
if err := tx.Create(&user).Error; err != nil {
    tx.Rollback()
} else {
    tx.Commit()
}

9. 错误处理

当使用 GORM 连接到数据库并执行 CRUD 操作时,以下是一些可能遇到的问题和解决方案:

  1. 连接数据库失败:

    • 问题:在连接数据库时,可能因为数据库服务器未启动、DSN 配置错误等原因导致连接失败。
    • 解决方案:确保数据库服务器已启动,DSN 配置正确,并检查防火墙设置等。
  2. 迁移失败:

    • 问题:在自动迁移时,可能因为表格已存在、数据库权限不足等原因导致迁移失败。
    • 解决方案:确保表格不存在,检查数据库用户权限是否足够。
  3. 查询为空或更新失败:

    • 问题:在查询或更新记录时,可能由于条件不匹配、数据库连接断开等原因导致操作失败。
    • 解决方案:确保查询条件正确,并保持数据库连接。
  4. 关联关系问题:

    • 问题:在定义和查询关联关系时,可能因为模型定义不正确或查询方法错误导致操作失败。
    • 解决方案:确保模型定义正确,参考 GORM 文档中关于关联关系的说明,并使用正确的预加载方法。