package utils import ( "errors" "fmt" "regexp" ) type Driver string const ( DM Driver = "dm" MySql Driver = "mysql" ) var supportDriverMap = map[string]Driver{ "mysql": MySql, "dm": DM, } func GroupUnitFunc(driver string, column, delimiter, tableAlia string) (sqlStr string) { dbDriver, _ := getDriverInstance(driver) if delimiter == "" { delimiter = "," } if column == "" { column = "[UNKNOWN COLUMN]" } if tableAlia != "" { column = fmt.Sprintf("%s.%s", tableAlia, column) } switch dbDriver { case MySql: sqlStr = fmt.Sprintf("GROUP_CONCAT(%s SEPARATOR '%s')", column, delimiter) case DM: sqlStr = fmt.Sprintf("LISTAGG(%s, '%s') WITHIN GROUP (ORDER BY %s)", column, delimiter, column) default: sqlStr = fmt.Sprintf("GROUP_CONCAT(%s SEPARATOR '%s')", column, delimiter) // 默认使用 MySQL 的语法 } return sqlStr } func getDriverInstance(driver string) (dbDriver Driver, err error) { if driver == "" { dbDriver = supportDriverMap[DbDriverName] } if currentDriver, ok := supportDriverMap[driver]; !ok { err = errors.New("不支持的数据库驱动类型") return } else { dbDriver = currentDriver } return } func NeedDateOrTimeFormat(driver string) bool { var dbDriver Driver if driver == "" { dbDriver = supportDriverMap[DbDriverName] } else { dbDriver, _ = getDriverInstance(driver) } if dbDriver == DM { return true } return false } func ReplaceDriverKeywords(driver string, sql string) string { dbDriver, _ := getDriverInstance(driver) rules := map[Driver]map[string]string{ DM: { "admin": `"admin"`, "value": `"value"`, "exchange": `"exchange"`, }, } replacements, ok := rules[dbDriver] if !ok { return sql } for keyword, replace := range replacements { // 仅替换单独的单词,复合单词含关键词不管 pattern := fmt.Sprintf(`\b%s\b`, regexp.QuoteMeta(keyword)) re := regexp.MustCompile(pattern) sql = re.ReplaceAllString(sql, replace) } return sql }