From 01027fb9c34ca8d964749649fba1046ff7cadfb0 Mon Sep 17 00:00:00 2001 From: ydy <517697206@qq.com> Date: Mon, 17 Feb 2025 14:00:47 +0800 Subject: [PATCH] feat:Init for compatibility --- gplus/cache.go | 5 ++++- gplus/dao.go | 55 +++++++++++++++++++++++++++-------------------- tests/dao_test.go | 2 +- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/gplus/cache.go b/gplus/cache.go index bb3b67b..7c1f041 100644 --- a/gplus/cache.go +++ b/gplus/cache.go @@ -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"] diff --git a/gplus/dao.go b/gplus/dao.go index 3d9f308..fa55cc4 100644 --- a/gplus/dao.go +++ b/gplus/dao.go @@ -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) } } @@ -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 @@ -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") +} diff --git a/tests/dao_test.go b/tests/dao_test.go index b4554fa..818dc60 100644 --- a/tests/dao_test.go +++ b/tests/dao_test.go @@ -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) {