構造体単位で適用する
gorm.DB全体に適用する
Plugin を使ってGlobalに設定することも可能
定義済みのcallbackはこちら https://github.com/go-gorm/gorm/blob/master/callbacks/callbacks.go
Query()
に対して gorm:query
という名前で定義済みなので、それのあとに実行するPluginは以下のように書ける
gormDb.Callback().Query().After("gorm:query").Register("custom_after_query", func(tx *gorm.DB) {
fmt.Printf("sql ==> %v, var ==> %v\n", tx.Statement.SQL.String(), tx.Statement.Vars)
})
各pluginの動きを見るために以下のように書いた
func NewDB(dialector gorm.Dialector) (*gorm.DB, error) {
gormDb, err := gorm.Open(dialector, &gorm.Config{
SkipDefaultTransaction: true,
PrepareStmt: true,
})
if err != nil {
return nil, err
}
{
t := "query"
gormDb.Callback().Query().Before("gorm:"+t).Register("before_"+t, func(tx *gorm.DB) {
fmt.Println("before_"+t, "sql", tx.Statement.SQL.String(), "var", tx.Statement.Vars)
})
gormDb.Callback().Query().After("gorm:"+t).Register("after_"+t, func(tx *gorm.DB) {
fmt.Println("after_"+t, "sql", tx.Statement.SQL.String(), "var", tx.Statement.Vars)
})
}
{
t := "preload"
gormDb.Callback().Query().Before("gorm:"+t).Register("before_"+t, func(tx *gorm.DB) {
fmt.Println("before_"+t, "sql", tx.Statement.SQL.String(), "var", tx.Statement.Vars)
})
gormDb.Callback().Query().After("gorm:"+t).Register("after_"+t, func(tx *gorm.DB) {
fmt.Println("after_"+t, "sql", tx.Statement.SQL.String(), "var", tx.Statement.Vars)
})
}
{
t := "after_query"
gormDb.Callback().Query().Before("gorm:"+t).Register("before_"+t, func(tx *gorm.DB) {
fmt.Println("before_"+t, "sql", tx.Statement.SQL.String(), "var", tx.Statement.Vars)
})
gormDb.Callback().Query().After("gorm:"+t).Register("after_"+t, func(tx *gorm.DB) {
fmt.Println("after_"+t, "sql", tx.Statement.SQL.String(), "var", tx.Statement.Vars)
})
}
{
t := "raw"
gormDb.Callback().Raw().Before("gorm:"+t).Register("before_"+t, func(tx *gorm.DB) {
fmt.Println("before_"+t, "sql", tx.Statement.SQL.String(), "var", tx.Statement.Vars)
})
gormDb.Callback().Raw().After("gorm:"+t).Register("after_"+t, func(tx *gorm.DB) {
fmt.Println("after_"+t, "sql", tx.Statement.SQL.String(), "var", tx.Statement.Vars)
})
}
{
t := "row"
gormDb.Callback().Row().Before("gorm:"+t).Register("before_"+t, func(tx *gorm.DB) {
fmt.Println("before_"+t, "sql", tx.Statement.SQL.String(), "var", tx.Statement.Vars)
})
gormDb.Callback().Raw().After("gorm:"+t).Register("after_"+t, func(tx *gorm.DB) {
fmt.Println("after_"+t, "sql", tx.Statement.SQL.String(), "var", tx.Statement.Vars)
})
}
return gormDb, nil
}