feat: 支持多模型提供商 embedding

This commit is contained in:
2026-04-01 13:38:33 +08:00
parent bcbe6eba78
commit 2e4a0a89f1
9 changed files with 631 additions and 447 deletions

View File

@@ -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())