GORM常用操作总结| 豆包MarsCode AI 刷题

49 阅读2分钟
  1. 安装 GORM

    go get -u gorm.io/gorm
    go get -u gorm.io/driver/sqlite
    

    这里以 SQLite 为例

  2. 导入 GORM

    import (
        "gorm.io/gorm"
        "gorm.io/driver/sqlite"
    )
    
  3. 连接数据库

    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    
  4. 定义模型

    type Product struct {
        gorm.Model
        Code  string
        Price uint
    }
    
  5. 自动迁移: GORM 可以根据模型自动创建数据库表。

    db.AutoMigrate(&Product{})
    
  6. 创建记录

    db.Create(&Product{Code: "D42", Price: 100})
    
  7. 查询记录

    • 通过主键查询:
      var product Product
      db.First(&product, 1) // 根据id查询
      
    • 查询所有记录:
      var products []Product
      db.Find(&products)
      
  8. 更新记录

    • 更新单个字段:
      db.Model(&product).Update("Price", 200)
      
    • 更新多个字段:
      db.Model(&product).Updates(Product{Price: 200, Code: "F42"})
      
  9. 删除记录

    db.Delete(&product, 1)
    
  10. 复杂查询

    • 条件查询:
      db.Where("price > ?", 100).Find(&products)
      
    • 链式操作:
      db.Where("price > ?", 100).Order("price desc").First(&product)
      
  11. 事务处理

    tx := db.Begin()
    // 执行一些数据库操作
    if tx.Error != nil {
        tx.Rollback()
    } else {
        tx.Commit()
    }
    
  12. 关联查询: 假设有两个模型 UserProfile,它们之间是一对多的关系:

    type User struct {
        gorm.Model
        Profile Profile
    }
    type Profile struct {
        gorm.Model
        Name string
    }
    // 查询用户及其关联的Profile
    var user User
    db.Preload("Profile").First(&user, 1)
    

高级用法

GORM 的高级用法包括但不限于钩子(Hooks)、预加载(Preload)、事务(Transactions)和模型关系(Model Relationships)。以下是这些高级用法的详细介绍:

1. 钩子(Hooks)

钩子允许你在特定的数据库操作之前或之后执行自定义逻辑。GORM 提供了多种钩子,包括 BeforeCreateAfterCreateBeforeUpdateAfterUpdateBeforeDeleteAfterDelete。这些钩子可以在模型上定义为方法,例如:

func (u *User) BeforeCreate(tx *gorm.DB) error {
    u.UUID = uuid.New()
    if !u.IsValid() {
        return errors.New("can't save invalid data")
    }
    return nil
}

func (u *User) AfterCreate(tx *gorm.DB) error {
    if u.ID == 1 {
        tx.Model(u).Update("role", "admin")
    }
    return nil
}

2. 预加载(Preload)

预加载允许你通过单个或多个 SQL 查询直接加载关联数据,减少数据库查询次数。例如,你可以使用 Preload 方法来主动加载关联的数据:

var users []User
db.Preload("Orders").Find(&users)

嵌套预加载也是支持的,例如:

db.Preload("Orders.OrderItems.Product").Preload("CreditCard").Find(&users)

3. 事务(Transactions)

GORM 提供了两种事务处理方法:Transaction 自动事务和 Begin 手动事务。Transaction 方法会在闭包函数执行完毕后自动提交或回滚事务,而 Begin 方法需要你手动管理事务的提交和回滚。

// 使用 Transaction 自动事务
db.Transaction(func(tx *gorm.DB) error {
    // 在这里执行数据库操作
    return nil
})

// 使用 Begin 手动事务
tx := db.Begin()
// 执行数据库操作
if err := tx.Error; err != nil {
    tx.Rollback()
} else {
    tx.Commit()
}

4. 模型关系(Model Relationships)

GORM 支持定义模型之间的关系,如属于(Belongs To)、包含一个(Has One)、包含多个(Has Many)和多对多(Many To Many)。这些关系可以通过 Joins 方法进行查询,例如:

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

var usersWithOrders []User
db.Joins("JOIN orders ON users.id = orders.user_id").Find(&usersWithOrders)