xChar
·7 days ago

image
在 Go 语言开发中,数据库操作是每个开发者都无法绕开的话题。而 GORM 作为一款功能强大、设计优雅的 ORM 库,凭借其简洁的 API 和丰富的功能,成为了 Go 开发者的首选工具。无论你是新手还是老手,掌握 GORM 的 API 都能让你的开发效率提升数倍!

今天,我们将深入探讨 GORM 的所有核心 API,带你从入门到精通,彻底掌握 GORM 的奥秘!

为什么选择 GORM?

GORM 不仅仅是一个 ORM 工具,它更像是一个数据库操作的瑞士军刀。以下是 GORM 的核心优势:

  • 简洁的 API 设计:链式调用,代码清晰易读。
  • 强大的功能支持:支持 CRUD、事务、钩子、预加载等高级功能。
  • 多数据库支持:MySQL、PostgreSQL、SQLite、SQL Server 等主流数据库。
  • 活跃的社区:丰富的文档和社区支持,问题解决速度快。

接下来,我们将从 初始化、模型定义、CRUD 操作、高级功能 四个方面,全面解析 GORM 的 API!

1. 初始化与配置

1.1 连接数据库

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 database")
    }
    fmt.Println("Database connected!")
}

1.2 配置 GORM

GORM 提供了丰富的配置选项,例如日志级别、表前缀等:

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: logger.Default.LogMode(logger.Info), // 设置日志级别
    NamingStrategy: schema.NamingStrategy{
        TablePrefix: "t_", // 表前缀
    },
})

2. 模型定义

2.1 定义模型

GORM 使用结构体来定义模型,每个字段可以通过标签(Tag)指定数据库约束:

type User struct {
    gorm.Model        // 内嵌 gorm.Model,包含 ID、CreatedAt、UpdatedAt、DeletedAt
    Name       string `gorm:"type:varchar(100);not null"`
    Age        int    `gorm:"default:18"`
    Email      string `gorm:"uniqueIndex"`
}

2.2 自动迁移

GORM 可以根据模型自动创建或更新表结构:

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

3. CRUD 操作

3.1 创建记录

// 创建单条记录
user := User{Name: "John", Age: 20}
result := db.Create(&user) // 返回 *gorm.DB
fmt.Println(user.ID)       // 获取插入的主键

// 批量创建
users := []User{{Name: "Alice"}, {Name: "Bob"}}
db.Create(&users)

3.2 查询记录

// 查询单条记录
var user User
db.First(&user, 1)          // 根据主键查询
db.First(&user, "name = ?", "John") // 条件查询

// 查询多条记录
var users []User
db.Find(&users)             // 查询所有记录
db.Where("age > ?", 18).Find(&users) // 条件查询

// 查询特定字段
db.Select("name", "age").Find(&users)

// 排序和分页
db.Order("age desc").Limit(10).Offset(0).Find(&users)

3.3 更新记录

// 更新单条记录
db.Model(&user).Update("Age", 21)

// 更新多个字段
db.Model(&user).Updates(User{Name: "Alice", Age: 22})

// 批量更新
db.Model(&User{}).Where("age < ?", 18).Update("age", 20)

3.4 删除记录

// 删除单条记录
db.Delete(&user)

// 根据主键删除
db.Delete(&User{}, 1)

// 批量删除
db.Where("age < ?", 18).Delete(&User{})

4. 高级功能

4.1 事务处理

GORM 支持手动和自动事务:

// 手动事务
tx := db.Begin()
if err := tx.Create(&User{Name: "John"}).Error; err != nil {
    tx.Rollback()
    return
}
tx.Commit()

// 自动事务
db.Transaction(func(tx *gorm.DB) error {
    if err := tx.Create(&User{Name: "John"}).Error; err != nil {
        return err
    }
    return nil
})

4.2 钩子函数

GORM 提供了模型生命周期钩子,可以在特定时间点执行自定义逻辑:

func (u *User) BeforeCreate(tx *gorm.DB) error {
    u.CreatedAt = time.Now()
    return nil
}

func (u *User) AfterDelete(tx *gorm.DB) error {
    fmt.Println("User deleted:", u.ID)
    return nil
}

4.3 预加载(解决 N+1 查询问题)

type Order struct {
    gorm.Model
    UserID uint
    User   User
}

var orders []Order
db.Preload("User").Find(&orders) // 预加载关联的 User 数据

4.4 原生 SQL

GORM 支持执行原生 SQL 语句:

var users []User
db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)

db.Exec("UPDATE users SET age = ? WHERE name = ?", 20, "John")

5. 关联关系

5.1 一对一

type Profile struct {
    gorm.Model
    UserID uint
    User   User
}

type User struct {
    gorm.Model
    Profile Profile
}

5.2 一对多

type Order struct {
    gorm.Model
    UserID uint
    User   User
}

type User struct {
    gorm.Model
    Orders []Order
}

5.3 多对多

type User struct {
    gorm.Model
    Languages []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
    gorm.Model
    Name  string
    Users []User `gorm:"many2many:user_languages;"`
}

6. 其他功能

6.1 软删除

GORM 支持软删除,记录不会被真正删除,而是设置 DeletedAt 字段:

db.Delete(&user) // 软删除
db.Unscoped().Delete(&user) // 硬删除

6.2 自定义表名

func (User) TableName() string {
    return "custom_users"
}

总结

GORM 的 API 设计简洁而强大,覆盖了数据库操作的方方面面。无论是简单的 CRUD 操作,还是复杂的关联查询和事务处理,GORM 都能轻松应对。通过熟练掌握这些 API,你可以大幅提升开发效率,写出更优雅、更高效的 Go 代码。

如果你对某个功能有更深入的需求,可以参考 GORM 官方文档 获取更多详细信息。希望这篇指南能帮助你彻底掌握 GORM,成为数据库操作的终极高手!

立即尝试 GORM,让你的 Go 语言开发飞起来! 🚀

欢迎关注我的公众号“全栈开发ck”,原创技术文章第一时间推送。

Loading comments...