|
@@ -13,12 +13,13 @@ type Driver string
|
|
|
type SqlCondition string
|
|
|
|
|
|
const (
|
|
|
- DM Driver = "dm"
|
|
|
- MySql Driver = "mysql"
|
|
|
- GroupUnit SqlCondition = "GroupUnit"
|
|
|
- Distinct SqlCondition = "Distinct"
|
|
|
- Order SqlCondition = "Order"
|
|
|
- Delimiter SqlCondition = "Delimiter"
|
|
|
+ DM Driver = "dm"
|
|
|
+ MySql Driver = "mysql"
|
|
|
+ GroupUnit SqlCondition = "GroupUnit"
|
|
|
+ Distinct SqlCondition = "Distinct"
|
|
|
+ Order SqlCondition = "Order"
|
|
|
+ Delimiter SqlCondition = "Delimiter"
|
|
|
+ ConvertColumn SqlCondition = "ConvertColumn"
|
|
|
)
|
|
|
|
|
|
var TemplateMap = map[SqlCondition]map[Driver]string{
|
|
@@ -26,6 +27,10 @@ var TemplateMap = map[SqlCondition]map[Driver]string{
|
|
|
MySql: `GROUP_CONCAT({{.Distinct}} {{.Column}} {{.Order}} SEPARATOR '{{.Delimiter}}')`,
|
|
|
DM: `LISTAGG({{.Distinct}} {{.Column}},'{{.Delimiter}}') WITHIN GROUP ({{.Order}})`,
|
|
|
},
|
|
|
+ ConvertColumn: {
|
|
|
+ MySql: `CONVERT({{.ConvertColumn}} USING gbk )`,
|
|
|
+ DM: `{{.ConvertColumn}}`,
|
|
|
+ },
|
|
|
}
|
|
|
|
|
|
var supportDriverMap = map[string]Driver{
|
|
@@ -35,14 +40,15 @@ var supportDriverMap = map[string]Driver{
|
|
|
}
|
|
|
|
|
|
type QueryParam struct {
|
|
|
- Driver string
|
|
|
- Column string
|
|
|
- Order string
|
|
|
- Distinct string
|
|
|
- Delimiter string
|
|
|
- OrderField string
|
|
|
- OrderRule string
|
|
|
- HasDistinct bool
|
|
|
+ Driver string
|
|
|
+ Column string
|
|
|
+ Order string
|
|
|
+ Distinct string
|
|
|
+ Delimiter string
|
|
|
+ OrderField string
|
|
|
+ OrderRule string
|
|
|
+ ConvertColumn string `description:"Convert指令传递的clounm"`
|
|
|
+ HasDistinct bool
|
|
|
}
|
|
|
type SqlParam interface {
|
|
|
GetParamName() string
|
|
@@ -61,6 +67,71 @@ func (distinctParam *DistinctParam) GetFormatConditionStr(param *QueryParam) str
|
|
|
return ""
|
|
|
}
|
|
|
|
|
|
+type ConvertParam struct {
|
|
|
+}
|
|
|
+
|
|
|
+func (convertParam *ConvertParam) GetParamName() string {
|
|
|
+ return "Convert"
|
|
|
+}
|
|
|
+func (convertParam *ConvertParam) GetFormatConditionStr(param *QueryParam) (sqlStr string) {
|
|
|
+ dbDriver, _ := getDriverInstance(param.Driver)
|
|
|
+ if param.ConvertColumn == "" {
|
|
|
+ FileLog.Error("转换字段为空,无法生成聚合sql")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var templateSqlStr string
|
|
|
+ if _, ok := TemplateMap[ConvertColumn][dbDriver]; !ok {
|
|
|
+ templateSqlStr = TemplateMap[ConvertColumn][MySql]
|
|
|
+ } else {
|
|
|
+ templateSqlStr = TemplateMap[ConvertColumn][dbDriver]
|
|
|
+ }
|
|
|
+ if templateSqlStr == "" {
|
|
|
+ FileLog.Error("转换sql模板不存在,无法生成转换sql")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ templateSql, err := template.New("ConvertColumn").Parse(templateSqlStr)
|
|
|
+ if err != nil {
|
|
|
+ FileLog.Error("failed to parse template: %v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //反射获取结构体的值
|
|
|
+ value := reflect.ValueOf(param)
|
|
|
+ // 检查是否是指针
|
|
|
+ if value.Kind() != reflect.Ptr {
|
|
|
+ fmt.Println("请求参数必须是一个结构体")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 获取结构体的元素
|
|
|
+ elem := value.Elem()
|
|
|
+ // 检查是否是结构体
|
|
|
+ if elem.Kind() != reflect.Struct {
|
|
|
+ fmt.Println("请求参数必须是一个结构体")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 获取字段的值
|
|
|
+ fieldValue := elem.FieldByName("ConvertColumn")
|
|
|
+ // 检查字段是否存在
|
|
|
+ if !fieldValue.IsValid() {
|
|
|
+ fmt.Printf("Error: field %s not found\n", "ConvertColumn")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 检查字段是否可导出
|
|
|
+ if !fieldValue.CanSet() {
|
|
|
+ fmt.Printf("Error: field %s is not exported and cannot be set\n", "ConvertColumn")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 渲染模板
|
|
|
+ var buf bytes.Buffer
|
|
|
+ err = templateSql.Execute(&buf, param)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Sprintf("执行模板填充失败: %v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sqlStr = buf.String()
|
|
|
+ fmt.Printf("生成的准换编码语句为:%s\n", sqlStr)
|
|
|
+ return sqlStr
|
|
|
+}
|
|
|
+
|
|
|
var sqlGeneratorFactory = map[SqlCondition]SqlParam{
|
|
|
// 添加支持的语法
|
|
|
GroupUnit: &GroupUnitParam{
|
|
@@ -70,9 +141,10 @@ var sqlGeneratorFactory = map[SqlCondition]SqlParam{
|
|
|
Delimiter,
|
|
|
},
|
|
|
},
|
|
|
- Order: &OrderParam{},
|
|
|
- Delimiter: &DelimiterParam{},
|
|
|
- Distinct: &DistinctParam{},
|
|
|
+ Order: &OrderParam{},
|
|
|
+ Delimiter: &DelimiterParam{},
|
|
|
+ Distinct: &DistinctParam{},
|
|
|
+ ConvertColumn: &ConvertParam{},
|
|
|
}
|
|
|
|
|
|
type DelimiterParam struct {
|