使用map创建gorm要用的where语句这样好吗?
因为go学习时间才一周时间,之前是php,所以习惯了那一套体系,gorm查询时需要不停创建struct
如果一个表有很多查询 每次查询的字段都各不相同,那可能就要创建很多个struct
可能是我还没学到精髓, 但是感觉这样不停写struct, 感觉好麻烦
然后百度各种搜索
最后看到这种方法 然后自己封装了下
请各位前辈看看 这样是否有问题 谢谢
func Find_(table string, where map[string]interface{}, field string, order string) (map[string]interface{}, error) {
sql, arr, err := WhereBuild(where)
result := map[string]interface{}{}
if err != nil {
return result, err
}
DB.Table(table).Where(sql, arr...).Order(order).Select(field).Take(&result)
return result, nil
}
func WhereBuild(where map[string]interface{}) (sql string, arr []interface{}, err error) {
for key, value := range where {
if key == "SQL" {
sql = fmt.Sprint(sql, value, " and ")
} else {
ks := strings.Split(key, "|")
switch len(ks) {
case 1:
sql = fmt.Sprint(sql, key, " = ?", " and ")
arr = append(arr, value)
break
case 2:
switch ks[1] {
case "=":
sql = fmt.Sprint(sql, ks[0], " = ?", " and ")
arr = append(arr, value)
break
case ">":
sql = fmt.Sprint(sql, ks[0], " > ?", " and ")
arr = append(arr, value)
break
case ">=":
sql = fmt.Sprint(sql, ks[0], " >= ?", " and ")
arr = append(arr, value)
break
case "<":
sql = fmt.Sprint(sql, ks[0], " < ?", " and ")
arr = append(arr, value)
break
case "<=":
sql = fmt.Sprint(sql, ks[0], " <= ?", " and ")
arr = append(arr, value)
break
case "!":
sql = fmt.Sprint(sql, ks[0], " != ?", " and ")
arr = append(arr, value)
break
case "in":
sql = fmt.Sprint(sql, ks[0], " in (?)", " and ")
arr = append(arr, value)
break
case "like":
sql = fmt.Sprint(sql, ks[0], " LIKE ?", " and ")
arr = append(arr, value)
break
}
default:
return "", nil, fmt.Errorf("where error : %s", key)
break
}
}
}
sql = strings.TrimRight(sql, "and ")
return
}
1. 运行环境
go 1.18
go数据操作和Orm《GO 全栈框架封装》
你这不是等于原始sql吗。。 还用orm干啥
本来orm让你不写sql了,你倒好又改回去了
where 为啥要不停的 struct model().Where("id",1).First(&data) 这样不行吗