Skip to content

Commit

Permalink
feat:Init for compatibility
Browse files Browse the repository at this point in the history
  • Loading branch information
bingtianyiyan committed Feb 17, 2025
1 parent 76ff0d1 commit 01027fb
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 25 deletions.
5 changes: 4 additions & 1 deletion gplus/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,10 @@ func getSubFieldColumnNameMap(valueOf reflect.Value, field reflect.StructField,
return result
}

// 解析字段名称 兼容多数据库切换
// 解析字段名称 兼容多数据库切换,
// 如果用户使用Option的GetDb而没有传数据库连接名这边获取的namingStrategy 是默认的一个可能会有问题,
// 所以建议用户多数据库的时候弃用Option里的Db,并且重新改写初始化,给与每个db连接有连接名
// 并且改造下多数据使用NewQuery和GetModel和NewQueryModel相关方法传入数据库连接名
func parseColumnName(field reflect.StructField, namingStrategy schema.Namer) string {
tagSetting := schema.ParseTagSetting(field.Tag.Get("gorm"), ";")
name, ok := tagSetting["COLUMN"]
Expand Down
55 changes: 32 additions & 23 deletions gplus/dao.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,28 +33,21 @@ var globalDbMap = make(map[string]*gorm.DB)
var globalDbKeys []string
var defaultBatchSize = 1000

func Init(db *gorm.DB) {
InitDb(db, constants.DefaultGormPlusConnName)
}

func InitDb(db *gorm.DB, dbConnName string) error {
if len(dbConnName) == 0 {
return errors.New("InitMultiple dbConnName is empty please check")
}
_, exists := globalDbMap[dbConnName]
if !exists {
// db instance register to global variable
globalDbMap[dbConnName] = db
globalDbKeys = append(globalDbKeys, dbConnName)
return nil
// Init 可选参数dbConnNameArr 代表数据库连接名,只需要传一个就行,
// 主要为了兼容之前用户只传一个db无需修改
func Init(db *gorm.DB, dbConnNameArr ...string) error {
var dbConnName = ""
if len(dbConnNameArr) > 0 {
dbConnName = dbConnNameArr[0]
}
return errors.New("InitMultiple have same name:" + dbConnName + ",please check")
return setGlobalInfo(db, dbConnName)
}

func InitDbMany(dic map[string]*gorm.DB) []error {
// InitMany 初始化多个
func InitMany(dic map[string]*gorm.DB) []error {
var errs []error
for k, v := range dic {
if err := InitDb(v, k); err != nil {
if err := setGlobalInfo(v, k); err != nil {
errs = append(errs, err)
}
}
Expand Down Expand Up @@ -516,12 +509,6 @@ func getOption(opts []OptionFunc) Option {
return config
}

func getOneOption(opt OptionFunc) Option {
var config Option
opt(&config)
return config
}

func setSelectIfNeed(option Option, db *gorm.DB) {
if len(option.Selects) > 0 {
var columnNames []string
Expand Down Expand Up @@ -609,3 +596,25 @@ func getDefaultDbByName(dbConnName string) (*gorm.DB, string, error) {
db, err := GetDb(dbConnName)
return db, dbConnName, err
}

func setGlobalInfo(db *gorm.DB, dbConnName string) error {
if len(dbConnName) == 0 {
//return errors.New("InitMultiple dbConnName is empty please check")
//如果字典里不包含了默认名则使用默认名,兼容之前单库
_, exists := globalDbMap[constants.DefaultGormPlusConnName]
if exists {
//根据db指针地址获取作为连接名,因为GORM 本身不提供直接获取数据库连接地址的方法,也不推荐使用反射来获取dsn
dbConnName = fmt.Sprintf("%p", db)
} else {
dbConnName = constants.DefaultGormPlusConnName
}
}
_, exists := globalDbMap[dbConnName]
if !exists {
// db instance register to global variable
globalDbMap[dbConnName] = db
globalDbKeys = append(globalDbKeys, dbConnName)
return nil
}
return errors.New("InitMultiple have same name:" + dbConnName + ",please check")
}
2 changes: 1 addition & 1 deletion tests/dao_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func initDb() {
}
var u User
gormDb1.AutoMigrate(u)
gplus.InitDb(gormDb1, gormDbConnName)
gplus.Init(gormDb1, gormDbConnName)
}

func TestInsert(t *testing.T) {
Expand Down

0 comments on commit 01027fb

Please sign in to comment.