構造体単位で適用する

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
}