Add skip hooks support

This commit is contained in:
Jinzhu 2020-11-17 15:19:58 +08:00
parent f5c2126c29
commit f6e1786ca2
3 changed files with 16 additions and 4 deletions

View File

@ -10,7 +10,7 @@ import (
) )
func BeforeCreate(db *gorm.DB) { func BeforeCreate(db *gorm.DB) {
if db.Error == nil && db.Statement.Schema != nil && (db.Statement.Schema.BeforeSave || db.Statement.Schema.BeforeCreate) { if db.Error == nil && db.Statement.Schema != nil && !db.Statement.UpdatingColumn && (db.Statement.Schema.BeforeSave || db.Statement.Schema.BeforeCreate) {
callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) {
if db.Statement.Schema.BeforeSave { if db.Statement.Schema.BeforeSave {
if i, ok := value.(BeforeSaveInterface); ok { if i, ok := value.(BeforeSaveInterface); ok {
@ -203,7 +203,7 @@ func CreateWithReturning(db *gorm.DB) {
} }
func AfterCreate(db *gorm.DB) { func AfterCreate(db *gorm.DB) {
if db.Error == nil && db.Statement.Schema != nil && (db.Statement.Schema.AfterSave || db.Statement.Schema.AfterCreate) { if db.Error == nil && db.Statement.Schema != nil && !db.Statement.UpdatingColumn && (db.Statement.Schema.AfterSave || db.Statement.Schema.AfterCreate) {
callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) { callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) {
if db.Statement.Schema.AfterSave { if db.Statement.Schema.AfterSave {
if i, ok := value.(AfterSaveInterface); ok { if i, ok := value.(AfterSaveInterface); ok {

11
gorm.go
View File

@ -64,6 +64,7 @@ type Session struct {
DryRun bool DryRun bool
PrepareStmt bool PrepareStmt bool
WithConditions bool WithConditions bool
SkipHooks bool
SkipDefaultTransaction bool SkipDefaultTransaction bool
AllowGlobalUpdate bool AllowGlobalUpdate bool
FullSaveAssociations bool FullSaveAssociations bool
@ -169,15 +170,17 @@ func (db *DB) Session(config *Session) *DB {
txConfig.FullSaveAssociations = true txConfig.FullSaveAssociations = true
} }
if config.Context != nil { if config.Context != nil || config.PrepareStmt || config.SkipHooks {
tx.Statement = tx.Statement.clone() tx.Statement = tx.Statement.clone()
tx.Statement.DB = tx tx.Statement.DB = tx
}
if config.Context != nil {
tx.Statement.Context = config.Context tx.Statement.Context = config.Context
} }
if config.PrepareStmt { if config.PrepareStmt {
if v, ok := db.cacheStore.Load("preparedStmt"); ok { if v, ok := db.cacheStore.Load("preparedStmt"); ok {
tx.Statement = tx.Statement.clone()
preparedStmt := v.(*PreparedStmtDB) preparedStmt := v.(*PreparedStmtDB)
tx.Statement.ConnPool = &PreparedStmtDB{ tx.Statement.ConnPool = &PreparedStmtDB{
ConnPool: db.Config.ConnPool, ConnPool: db.Config.ConnPool,
@ -189,6 +192,10 @@ func (db *DB) Session(config *Session) *DB {
} }
} }
if config.SkipHooks {
tx.Statement.UpdatingColumn = true
}
if config.WithConditions { if config.WithConditions {
tx.clone = 2 tx.clone = 2
} }

View File

@ -371,6 +371,11 @@ func TestSetColumn(t *testing.T) {
t.Errorf("invalid data after update, got %+v", product) t.Errorf("invalid data after update, got %+v", product)
} }
DB.Model(&product).Session(&gorm.Session{SkipHooks: true}).Updates(Product3{Code: "L1216"})
if product.Price != 270 || product.Code != "L1216" {
t.Errorf("invalid data after update, got %+v", product)
}
var result2 Product3 var result2 Product3
DB.First(&result2, product.ID) DB.First(&result2, product.ID)