使用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

讨论数量: 7
2年前 评论
AB (作者) 2年前
mofung 2年前
AB (作者) 2年前

你这不是等于原始sql吗。。 还用orm干啥
本来orm让你不写sql了,你倒好又改回去了

2年前 评论
paigusu (楼主) 2年前

where 为啥要不停的 struct model().Where("id",1).First(&data) 这样不行吗

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!