之前在做erp系统内的SmartQuery功能
需要从资料库里面捞出来query并且显示结果
但使用gorm必须要事先定义struct,于是上网搜寻找到了这个方法(原文)
好处在于
程式非常抽象,只需关注在Query上解决raw query使用select时不知道会有哪些column,需要事先定义struct的问题// RawQuerySearchAndParseToMap ...func RawQuerySearchAndParseToMap(db *gorm.DB, query string) ([]map[string]interface{}, error) {//Use raw queryrows, err := db.Raw(query).Rows()if err != nil {log.Println(err)return nil, err}//取得搜寻回来的资料所拥有的columncolumns, er := rows.Columns()if er != nil {log.Println(er)return nil, er}columnLength := len(columns)//make一个临时储存的地方,并赋予指标cache := make([]interface{}, columnLength)for index := range cache {var a interface{}cache[index] = &a}var list []map[string]interface{}for rows.Next() {rows.Scan(cache...)item := make(map[string]interface{})for i, data := range cache {item[columns[i]] = *data.(*interface{}) //column可能有许多种data type,因此在这取出时不指定型别,否则会转换错误,且在这取出时为uint8(btye array)格式}list = append(list, item)}//将byte array转换为字串for index := range list {for _, column := range columns {list[index][column] = list[index][column].(string)}}return list, nil}