package vConfig import ( "fmt" "net/url" "strings" ) type Config struct { Database struct { DmDsn string `yaml:"dm_dsn"` } `yaml:"database"` User string Pwd string IP string Port string Schema string } // LoadConfig 从指定路径加载 YAML 配置 func LoadConfig(envPass string) (*Config, error) { // 解析 YAML var config Config config.Database.DmDsn = envPass // 预处理:如果字符串以 dm:// 开头则替换为 http:// 便于 url.Parse 解析 u, err := url.Parse(envPass) if err != nil { return nil, fmt.Errorf("解析连接字符串失败: %v", err) } // 用户信息 userInfo := u.User if userInfo == nil { return nil, fmt.Errorf("缺少用户信息") } config.User = userInfo.Username() // 获取密码 if pwd, ok := userInfo.Password(); ok { config.Pwd = pwd } else { return nil, fmt.Errorf("密码解析失败") } // 拆分主机和端口 host, port := u.Hostname(), u.Port() if host == "" { return nil, fmt.Errorf("缺少IP地址") } config.IP = host // 端口处理(默认端口5236) if port == "" { config.Port = "5236" // 达梦默认端口 } else { config.Port = port } // 数据库名(路径部分) if pathParts := strings.Split(strings.Trim(u.Path, "/"), "/"); len(pathParts) > 0 { config.Schema = pathParts[0] } else { return nil, fmt.Errorf("缺少数据库名") } // 获取schema参数 schema := u.Query().Get("schema") if schema == "" { return nil, fmt.Errorf("缺少schema参数") } config.Schema = schema return &config, nil }