一架梯子,一头程序猿,仰望星空!
GORM面试题 > 内容正文

了解Gorm的HOOK机制吗?它能解决什么问题?


问题简答

GORM 的 HOOK 机制是在模型的生命周期中提供了钩子函数,可以在各个时刻对模型进行操作。通过 HOOK 机制,可以在增删改查执行过程,执行一些额外的逻辑或处理。常见的使用场景包括自动填充创建时间和更新时间、软删除、数据加密等等。

问题详解:

1.GORM支持的钩子

钩子函数名 钩子作用
BeforeSave 在执行数据保存前被调用,用于设置一些默认值
BeforeCreate 在创建新纪录前被调用
AfterCreate 在创建新纪录后被调用
BeforeUpdate 在更新纪录前被调用
AfterUpdate 在更新纪录后被调用
BeforeDelete 在删除纪录前被调用
AfterDelete 在删除纪录后被调用

2.hook使用例子

// 定义用户struct
type User struct {
    ID        uint   `gorm:"primaryKey"`
    Name      string `gorm:"not null"`
    Email     string `gorm:"unique; not null"`
    Password  string `gorm:"not null"`
    CreatedAt time.Time
    UpdatedAt time.Time
}

// 添加记录之前执行BeforeCreate
func (u *User) BeforeCreate(tx *gorm.DB) error {
    // 在创建新用户之前,对密码进行加密
    hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
    if err != nil {
        return err
    }
    u.Password = string(hashedPassword)
    return nil
}

// 添加用户之后执行
func (u *User) AfterCreate(tx *gorm.DB) error {
    // 在创建新用户之后,给用户发送欢迎邮件
    emailContent := fmt.Sprintf("Dear %s,\n\nThank you for signing up!", u.Name)
    err := sendWelcomeEmail(u.Email, emailContent)
    if err != nil {
        return err
    }
    return nil
}

// 创建一个新用户
func CreateUser(name string, email string, password string) error {
    user := &User{
        Name:     name,
        Email:    email,
        Password: password,
    }
    result := db.Create(user)
    if result.Error != nil {
        return result.Error
    }
    return nil
}