feat: 支持多模型提供商 embedding
This commit is contained in:
@@ -373,6 +373,7 @@ var (
|
||||
)
|
||||
|
||||
type Gfdb interface {
|
||||
Exec(ctx context.Context, sql string, args ...any) (sql.Result, error)
|
||||
Model(ctx context.Context, tableNameOrStruct ...any) *model
|
||||
Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) error
|
||||
}
|
||||
@@ -389,17 +390,45 @@ type dataBase struct {
|
||||
gdb.DB
|
||||
}
|
||||
|
||||
func DB(ctx context.Context) Gfdb {
|
||||
var dbName []string
|
||||
func GetTablePrefix(ctx context.Context) (prefix string, err error) {
|
||||
tenantId, config, err := checkSchemaConfig(ctx)
|
||||
if err != nil {
|
||||
glog.Errorf(ctx, "[DB] checkSchemaConfig error: %v", err)
|
||||
return
|
||||
}
|
||||
if config {
|
||||
sprintf := fmt.Sprintf("database.%s%v.0.prefix", schemaPrefix, tenantId)
|
||||
prefix = g.Cfg().MustGet(ctx, sprintf).String()
|
||||
return
|
||||
}
|
||||
prefix = g.Cfg().MustGet(ctx, "database.default.0.prefix").String()
|
||||
return
|
||||
}
|
||||
|
||||
func checkSchemaConfig(ctx context.Context) (uint64, bool, error) {
|
||||
user, err := utils.GetUserInfo(ctx)
|
||||
if err != nil {
|
||||
glog.Errorf(ctx, "[DB] GetUserInfo error: %v", err)
|
||||
return nil
|
||||
return 0, false, err
|
||||
}
|
||||
|
||||
var schema = fmt.Sprintf("%s%v", schemaPrefix, user.TenantId)
|
||||
sprintf := fmt.Sprintf("database.%s", schema)
|
||||
if !g.Cfg().MustGet(ctx, sprintf).IsEmpty() {
|
||||
return user.TenantId, true, nil
|
||||
}
|
||||
return user.TenantId, false, nil
|
||||
}
|
||||
|
||||
func DB(ctx context.Context) Gfdb {
|
||||
tenantId, config, err := checkSchemaConfig(ctx)
|
||||
if err != nil {
|
||||
glog.Errorf(ctx, "[DB] checkSchemaConfig error: %v", err)
|
||||
return nil
|
||||
}
|
||||
var schema = fmt.Sprintf("%s%v", schemaPrefix, tenantId)
|
||||
|
||||
var dbName []string
|
||||
if config {
|
||||
dbName = append(dbName, schema)
|
||||
} else {
|
||||
dbName = append(dbName, "default")
|
||||
@@ -418,26 +447,24 @@ func DB(ctx context.Context) Gfdb {
|
||||
}
|
||||
|
||||
func (d *dataBase) Model(ctx context.Context, tableNameOrStruct ...any) *model {
|
||||
user, err := utils.GetUserInfo(ctx)
|
||||
if err != nil {
|
||||
glog.Errorf(ctx, "[DB] GetUserInfo error: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
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() {
|
||||
tenantId, config, err := checkSchemaConfig(ctx)
|
||||
if err != nil {
|
||||
glog.Errorf(ctx, "[DB] checkSchemaConfig error: %v", err)
|
||||
return nil
|
||||
}
|
||||
if config {
|
||||
// 创建按地区分库的配置
|
||||
shardingConfig := gdb.ShardingConfig{
|
||||
Schema: gdb.ShardingSchemaConfig{
|
||||
Enable: true, // 启用分库
|
||||
Prefix: schemaPrefix, // 分库前缀
|
||||
Rule: &RegionShardingRule{RegionMapping: user.TenantId}, // 自定义分库规则
|
||||
Enable: true, // 启用分库
|
||||
Prefix: schemaPrefix, // 分库前缀
|
||||
Rule: &RegionShardingRule{RegionMapping: tenantId}, // 自定义分库规则
|
||||
},
|
||||
}
|
||||
m.Sharding(shardingConfig).ShardingValue(user.TenantId)
|
||||
m.Sharding(shardingConfig).ShardingValue(tenantId)
|
||||
}
|
||||
|
||||
m.OmitNil().Hook(catchSQLHook())
|
||||
|
||||
Reference in New Issue
Block a user