gorm-plugin
ExplainPlugin
Check if index is used when thresholdTime <= sqlCostTime
import (
"github.com/longlihale/gorm-plugin"
)
DB.Use(gormplugin.NewExplainPluginWithTimeout(3 * time.Millisecond))
// create users
DB.Create(createUsers)
DB.Model(&User{}).Where("name = ?", "user_1").Find(&User{})
// [error] sql:[SELECT * FROM `users` WHERE name = 'user_1' AND `users`.`deleted_at` IS NULL], not hit index.
DB.Model(&User{}).Where("age = ?", 1).Find(&User{})
// [info] sql:[SELECT * FROM `users` WHERE age = 1 AND `users`.`deleted_at` IS NULL], hit index: [idx_users_age].
NOTE: only support MySQL
and not recommended for online.
UnderwritePlugin
Read again master when master-slave data is inconsistent when rows = 0 && err == nil
import (
"github.com/longlihale/gorm-plugin"
)
DB.Use(gormplugin.NewUnderwritePlugin())
DB.Clauses(dbresolver.Write).Create(&User{Name: "kinggo", Age: 18})
// INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`age`) VALUES ('2021-12-22 14:47:23.776','2021-12-22 14:47:23.776',NULL,'kinggo',18)
conn := DB.Clauses(dbresolver.Read).Where("Age = ?", 18).Find(&User{})
//exec sql:[SELECT * FROM `users` WHERE Age = 18 AND `users`.`deleted_at` IS NULL] in master db
if conn.RowsAffected != 1 {
t.Fatalf("underwrite failed.")
}
NOTE
- it is suitable for
GET
, not forQuery
. - should new another
*gorm.DB
to use it.