iT邦幫忙

0

Golang-Row Data Parse to Map

  • 分享至 

  • twitterImage
  •  

之前在做erp系統內的SmartQuery功能
需要從資料庫裡面撈出來query並且顯示結果
但使用gorm必須要事先定義struct,於是上網搜尋找到了這個方法(原文)

好處在於

  1. 程式非常抽象,只需關注在Query上
  2. 解決raw query使用select時不知道會有哪些column,需要事先定義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

}

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言