gorm的clone,导致中间件读取不到Statement的 Setting
Your Question
å¼å代ç çæ¶åå¨å¤å±è®¾ç½®äº gorm:table_options 代ç å¦ä¸:
db.Debug().Model(info).WithContext(context.TODO()).
Set("gorm:table_options", " ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_bin COMMENT='æµè¯' "+
"shardkey=f_userid").AutoMigrate(&info)
å¨ AutoMigrate, stmtä¸ç DB æ¿å°ç m.sharding.DB
stmt := &gorm.Statement{DB: m.sharding.DB}
è·äºä¸ä»£ç ï¼ åç°è¿ä¸ª dbæ¯å¨ useçæ¶å被设置ç
db.Use(sharding.Register(sharding.Config{} ....)
ç°å¨éå°äºè¿æ ·çä¸ä¸ªé®é¢ï¼ææ¯æ³è°ç¨AutoMigrateæ¥å£è¿è¡å»ºè¡¨ï¼ 使¯æAutoMigrateä»£ç æ¯å¨ use 代ç ä¸é¢(示ä¾ä»£ç åèæå)ï¼ å¦ææè°ç¨äºä»»æä¸ä¸ª chainable_apiï¼æ¯å¦ Model(), ä»å é¨è°ç¨getInstanceï¼ é£ä¹ç±äºåå§åçæ¶å clone 为 1ï¼é£ä¹å°±ä¼éæ°çæä¸ä¸ªæ°ç DBã
ç°å¨çé®é¢æ¯ï¼useçæ¶å使ç¨äºæå¼å§ç DB, ä¸å±ä¸å±çè°ç¨chainable_apiï¼çææ°ç DBï¼æå¨æ°ç DB ä¸ç设置ï¼èç DB å®å ¨ä¸ç¥éã å°çæ£AutoMigrateçæ¶åï¼ä½¿ç¨çæ¯èç DBã ç»æåç°è®¾ç½®ç gorm:table_options æ ¹æ¬æ²¡æçæã
è¿éç®å导è´äºæå¨å¤é¢è°ç¨ Set ææè®¾ç½®ä¸ä¸ gorm:table_options ï¼ç»æå®å ¨æ²¡æè®¾ç½®è¿å» ã
The document you expected this should be explained
Expected answer
è¿éæ³ç¥éè¿æ ·è®¾è®¡çèèæ¯ä»ä¹ï¼ä»¥åææ²¡æä»ä¹ä¼é çåæ³æ Setéä¼ è¿å»ã
妿æ¯å å° DB å ¨é¨é½è®¾ç½®å®ï¼ç¶åå¨è°ç¨ useï¼æåè°ç¨ AutoMigrate ï¼è¿æ ·ä¸ç¥éè¡ä¸è¡ï¼ä½æ¯æè§ä¸å¤ªå¥½ï¼æä»¬ç代ç ä¸ï¼useæ¯æ¾å¨äºåå§åé£éï¼ AutoMigrate åå ¶ä»ç Find Update 䏿 ·æ¯åç¬ç彿°ã
代ç å¦ä¸:
package main
import (
"errors"
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
glog "gorm.io/gorm/logger"
"gorm.io/sharding"
"hash/crc32"
"time"
)
var dsn = "root:XXXXxxxx@tcp(xxxxxxx:3306)/xxxxx?charset=utf8mb4&parseTime=True&loc=Local"
func (*Test) TableName() string {
return "TestTable"
}
type Test struct {
Test string
}
type GormLogger struct {
}
func (g GormLogger) Printf(s string, i ...interface{}) {
fmt.Printf(s, i...)
}
func test() {
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: glog.New(&GormLogger{}, glog.Config{
SlowThreshold: 200 * time.Millisecond,
LogLevel: glog.Warn,
IgnoreRecordNotFoundError: false,
Colorful: true,
})})
if err != nil {
fmt.Printf("tdsql init failed, err: %v\n", err)
return
}
db.Use(sharding.Register(sharding.Config{
ShardingKey: "test",
NumberOfShards: 100,
ShardingAlgorithm: func(columnValue any) (suffix string, err error) {
if test, ok := columnValue.(string); ok {
hash := crc32.ChecksumIEEE([]byte(test)) % 100
return fmt.Sprintf("_%02d", hash), nil
}
return "", errors.New("invalid test")
},
PrimaryKeyGenerator: sharding.PKCustom,
PrimaryKeyGeneratorFn: func(tableIdx int64) int64 {
return 0
},
ShardingSuffixs: func() (suffixs []string) {
numberOfShards := 100
for i := 0; i < numberOfShards; i++ {
suffixs = append(suffixs, fmt.Sprintf("_%02d", i%numberOfShards))
}
return
},
}, "TestTable"))
info := &Test{}
db.Model(info).
Set("gorm:table_options", " ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_bin COMMENT='æµè¯' ").AutoMigrate(&info)
if err != nil {
return
}
}
func main() {
test()
}