fix: 修复数据库钩子及分片配置逻辑问题
This commit is contained in:
@@ -40,7 +40,7 @@ type MongoBaseDO struct {
|
|||||||
|
|
||||||
// SQLBaseDO SQL数据库基础实体
|
// SQLBaseDO SQL数据库基础实体
|
||||||
type SQLBaseDO struct {
|
type SQLBaseDO struct {
|
||||||
Id uint64 `orm:"id" json:"id"` // 主键ID
|
Id *uint64 `orm:"id" json:"id"` // 主键ID
|
||||||
Bid string `orm:"bid" json:"bid"` // 业务ID
|
Bid string `orm:"bid" json:"bid"` // 业务ID
|
||||||
Creator string `orm:"creator" json:"creator"` // 创建人
|
Creator string `orm:"creator" json:"creator"` // 创建人
|
||||||
CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间
|
CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间
|
||||||
|
|||||||
@@ -167,10 +167,10 @@ func insertHook(ctx context.Context, in *gdb.HookInsertInput) (result sql.Result
|
|||||||
//}
|
//}
|
||||||
for i := range in.Data {
|
for i := range in.Data {
|
||||||
if !g.IsEmpty(userInfo.UserName) {
|
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
|
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
|
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) {
|
switch data := in.Data.(type) {
|
||||||
case gdb.Map:
|
case gdb.Map:
|
||||||
if !g.IsEmpty(userInfo.UserName) {
|
if !g.IsEmpty(userInfo.UserName) {
|
||||||
if _, ok := data["updater"]; !ok {
|
if _, ok := data["updater"]; ok {
|
||||||
data["updater"] = userInfo.UserName
|
data["updater"] = userInfo.UserName
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case gdb.List:
|
case gdb.List:
|
||||||
for i := range data {
|
for i := range data {
|
||||||
if !g.IsEmpty(userInfo.UserName) {
|
if !g.IsEmpty(userInfo.UserName) {
|
||||||
if _, ok := data[i]["updater"]; !ok {
|
if _, ok := data[i]["updater"]; ok {
|
||||||
data[i]["updater"] = userInfo.UserName
|
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) {
|
func selectHook(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) {
|
||||||
traceID := getTraceID(ctx)
|
traceID := getTraceID(ctx)
|
||||||
if traceID == "" {
|
|
||||||
return nil, fmt.Errorf("[DB] GetTraceID error: traceID is empty")
|
|
||||||
}
|
|
||||||
enabled, err := gcache.Get(ctx, traceID)
|
enabled, err := gcache.Get(ctx, traceID)
|
||||||
// 未启用缓存,直接执行查询
|
// 未启用缓存,直接执行查询
|
||||||
if !gconv.Bool(enabled) {
|
if !gconv.Bool(enabled) {
|
||||||
@@ -384,7 +382,13 @@ func DB(ctx context.Context) Gfdb {
|
|||||||
dbName = append(dbName, schema)
|
dbName = append(dbName, schema)
|
||||||
} else {
|
} else {
|
||||||
dbName = append(dbName, "default")
|
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{
|
return &dataBase{
|
||||||
@@ -398,18 +402,26 @@ func (d *dataBase) Model(ctx context.Context, tableNameOrStruct ...any) *model {
|
|||||||
glog.Errorf(ctx, "[DB] GetUserInfo error: %v", err)
|
glog.Errorf(ctx, "[DB] GetUserInfo error: %v", err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// 创建按地区分库的配置
|
|
||||||
shardingConfig := gdb.ShardingConfig{
|
m := d.DB.Model(tableNameOrStruct...).Ctx(ctx)
|
||||||
Schema: gdb.ShardingSchemaConfig{
|
|
||||||
Enable: true, // 启用分库
|
var schema = fmt.Sprintf("%s%v", schemaPrefix, user.TenantId)
|
||||||
Prefix: schemaPrefix, // 分库前缀
|
sprintf := fmt.Sprintf("database.%s", schema)
|
||||||
Rule: &RegionShardingRule{RegionMapping: user.TenantId}, // 自定义分库规则
|
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{
|
return &model{
|
||||||
Model: hook,
|
Model: m,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user