InfoSphere/GORM 中文版/ 返回书籍
Tutorials

Hooks

qianmoQqianmoQ· 更新于 2026-09-15· 阅读 7 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Object Life Cycle

Hooks are functions that are called before or after creation/querying/updating/deletion.

If you have defined specified methods for a model, it will be called automatically when creating, updating, querying, deleting, and if any callback returns an error, GORM will stop future operations and rollback current transaction.

The type of hook methods should be func(*gorm.DB) error

Hooks

Creating an object

Available hooks for creating


BeforeSave
BeforeCreate



AfterCreate
AfterSave

Code Example:

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

  if !u.IsValid() {
    err = errors.New("can't save invalid data")
  }
  return
}

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

NOTE Save/Delete operations in GORM are running in transactions by default, so changes made in that transaction are not visible until it is committed, if you return any error in your hooks, the change will be rollbacked

func (u *User) AfterCreate(tx *gorm.DB) (err error) {
  if !u.IsValid() {
    return errors.New("rollback invalid user")
  }
  return nil
}

Updating an object

Available hooks for updating


BeforeSave
BeforeUpdate



AfterUpdate
AfterSave

Code Example:

func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {
  if u.readonly() {
    err = errors.New("read only user")
  }
  return
}


func (u *User) AfterUpdate(tx *gorm.DB) (err error) {
  if u.Confirmed {
    tx.Model(&Address{}).Where("user_id = ?", u.ID).Update("verfied", true)
  }
  return
}

Deleting an object

Available hooks for deleting


BeforeDelete

AfterDelete

Code Example:


func (u *User) AfterDelete(tx *gorm.DB) (err error) {
  if u.Confirmed {
    tx.Model(&Address{}).Where("user_id = ?", u.ID).Update("invalid", false)
  }
  return
}

Querying an object

Available hooks for querying



AfterFind

Code Example:

func (u *User) AfterFind(tx *gorm.DB) (err error) {
  if u.MemberShip == "" {
    u.MemberShip = "user"
  }
  return
}

Modify current operation

func (u *User) BeforeCreate(tx *gorm.DB) error {
  
  tx.Statement.Select("Name", "Age")
  tx.Statement.AddClause(clause.OnConflict{DoNothing: true})

  
  
  var role Role
  err := tx.First(&role, "name = ?", user.Role).Error
  
  
  return err
}

GitHub tag (latest SemVer)

评论

登录后参与评论

正在加载评论…