之前在做erp系統內的SmartQuery功能
需要從資料庫裡面撈出來query並且顯示結果
但使用gorm必須要事先定義struct,於是上網搜尋找到了這個方法(原文)
好處在於
// RawQuerySearchAndParseToMap ...
func RawQuerySearchAndParseToMap(db *gorm.DB, query string) ([]map[string]interface{}, error) {
//Use raw query
rows, err := db.Raw(query).Rows()
if err != nil {
log.Println(err)
return nil, err
}
//取得搜尋回來的資料所擁有的column
columns, 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
}