記錄

func InsertBatch(tablename string, els []map[string]interface{}) map[string]interface{} {
values := make([]interface{}, 0)
sql := “INSERT INTO " + tablename
var upStr string
var firstEl map[string]interface{} //第一個插入或修改的對象
lenEls := len(els) //因爲golang對象遍歷的隨機性,我們取出第一個對象先分析,去除隨機性
if lenEls > 0 {
firstEl = els[0]
}else { //一個元素都沒有,顯然調用參數不對
rs := make(map[string]interface{})
rs[“code”] = 301
rs[“err”] = “Params is wrong, element must not be empty.”
return rs
}
var allKey []string //保存一個對象的所有字段,對象訪問時就按這個順序
eleHolder := “(”
index := 0
psLen := len(firstEl)
for k, v := range firstEl {
index++
eleHolder += “?” //佔位符
upStr += k + " = values (” + k + “)” //更新操作時的字段與值對應關係
if index < psLen { //非最後一個key
eleHolder += “,”
upStr += “,”
}else{
eleHolder += “)”
}
allKey = append(allKey, k) //key
values = append(values, v) //value
}
//批量操作的第一個對象語句的自動生成
sql += " ("+strings.Join(allKey, “,”)+") values " + eleHolder

for i := 1; i < lenEls; i++ {             //依據對第一個對象的分析,生成所有的後續對象
    sql += "," + eleHolder
    for _, key := range allKey {
        values = append(values, els[i][key])
    }
}
//當主鍵或唯一索引存在時,進行更新操作的sql語句生成
sql += " ON DUPLICATE KEY UPDATE " + upStr
return execute(sql, values)

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章