fix: 修复数据库钩子及分片配置逻辑问题

This commit is contained in:
2026-03-18 09:18:35 +08:00
parent 9c967eed4c
commit 7714326db7
2 changed files with 30 additions and 18 deletions

View File

@@ -40,7 +40,7 @@ type MongoBaseDO struct {
// SQLBaseDO SQL数据库基础实体
type SQLBaseDO struct {
Id uint64 `orm:"id" json:"id"` // 主键ID
Id *uint64 `orm:"id" json:"id"` // 主键ID
Bid string `orm:"bid" json:"bid"` // 业务ID
Creator string `orm:"creator" json:"creator"` // 创建人
CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间

View File

@@ -167,10 +167,10 @@ func insertHook(ctx context.Context, in *gdb.HookInsertInput) (result sql.Result
//}
for i := range in.Data {
if !g.IsEmpty(userInfo.UserName) {
if _, ok := in.Data[i]["creator"]; !ok {
if _, ok := in.Data[i]["creator"]; ok {
in.Data[i]["creator"] = userInfo.UserName
}
if _, ok := in.Data[i]["updater"]; !ok {
if _, ok := in.Data[i]["updater"]; ok {
in.Data[i]["updater"] = userInfo.UserName
}
}
@@ -206,14 +206,14 @@ func updateHook(ctx context.Context, in *gdb.HookUpdateInput) (result sql.Result
switch data := in.Data.(type) {
case gdb.Map:
if !g.IsEmpty(userInfo.UserName) {
if _, ok := data["updater"]; !ok {
if _, ok := data["updater"]; ok {
data["updater"] = userInfo.UserName
}
}
case gdb.List:
for i := range data {
if !g.IsEmpty(userInfo.UserName) {
if _, ok := data[i]["updater"]; !ok {
if _, ok := data[i]["updater"]; ok {
data[i]["updater"] = userInfo.UserName
}
}
@@ -260,9 +260,7 @@ func deleteHook(ctx context.Context, in *gdb.HookDeleteInput) (result sql.Result
func selectHook(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) {
traceID := getTraceID(ctx)
if traceID == "" {
return nil, fmt.Errorf("[DB] GetTraceID error: traceID is empty")
}
enabled, err := gcache.Get(ctx, traceID)
// 未启用缓存,直接执行查询
if !gconv.Bool(enabled) {
@@ -384,7 +382,13 @@ func DB(ctx context.Context) Gfdb {
dbName = append(dbName, schema)
} else {
dbName = append(dbName, "default")
schema = g.Cfg().MustGet(ctx, "database.default.name").String()
// 配置文件中 default 是数组格式,需要通过索引 0 访问
defaultConfig := g.Cfg().MustGet(ctx, "database.default")
if defaultConfig.IsSlice() {
schema = g.Cfg().MustGet(ctx, "database.default.0.name").String()
} else {
schema = g.Cfg().MustGet(ctx, "database.default.name").String()
}
}
return &dataBase{
@@ -398,18 +402,26 @@ func (d *dataBase) Model(ctx context.Context, tableNameOrStruct ...any) *model {
glog.Errorf(ctx, "[DB] GetUserInfo error: %v", err)
return nil
}
// 创建按地区分库的配置
shardingConfig := gdb.ShardingConfig{
Schema: gdb.ShardingSchemaConfig{
Enable: true, // 启用分库
Prefix: schemaPrefix, // 分库前缀
Rule: &RegionShardingRule{RegionMapping: user.TenantId}, // 自定义分库规则
},
m := d.DB.Model(tableNameOrStruct...).Ctx(ctx)
var schema = fmt.Sprintf("%s%v", schemaPrefix, user.TenantId)
sprintf := fmt.Sprintf("database.%s", schema)
if !g.Cfg().MustGet(ctx, sprintf).IsEmpty() {
// 创建按地区分库的配置
shardingConfig := gdb.ShardingConfig{
Schema: gdb.ShardingSchemaConfig{
Enable: true, // 启用分库
Prefix: schemaPrefix, // 分库前缀
Rule: &RegionShardingRule{RegionMapping: user.TenantId}, // 自定义分库规则
},
}
m.Sharding(shardingConfig).ShardingValue(user.TenantId)
}
hook := d.DB.Model(tableNameOrStruct...).Ctx(ctx).Sharding(shardingConfig).ShardingValue(user.TenantId).OmitNilWhere().Hook(catchSQLHook())
m.OmitNilData().OmitNilWhere().Hook(catchSQLHook())
return &model{
Model: hook,
Model: m,
}
}