gorm批量插入解決方案

2021-10-05 02:36:16 字數 2367 閱讀 2022

我有乙個朋友, 最近用gorm發現官方不支援批量插入, 看官方issue 2023年就有人提過這個問題了, 不過現在還不支援

但是問題不大, 官方留出來乙個執行原生sql(db.exec)的方法來解決這個問題, 而且官方現在在開發v2版本, 在v2版本中就會支援這個功能了

但是生活還得繼續, bug還是得繼續寫, 本來想在網上找乙個公用方法來維持一下生活, 結果竟然沒找見!

都是指定單個結構體去插入的

這當然不行了, 寫**的意義不就是為了減輕重複的工作嘛, 既然這樣, 就只能自己動手豐衣足食了

下面為生成語句的方法

// getbranchinsertsql 獲取批量新增資料sql語句

func getbranchinsertsql(objs inte***ce{}, tablename string) string

fieldname := ""

var valuetypelist string

fieldnum := reflect.typeof(objs[0]).numfield()

fieldt := reflect.typeof(objs[0])

for a := 0; a < fieldnum; a++ else

// 獲取字段型別

if fieldt.field(a).type.name() == "string" else if strings.index(fieldt.field(a).type.name(), "uint") != -1 else if strings.index(fieldt.field(a).type.name(), "int") != -1

} var valuelist string

for _, obj := range objs else

} v += ")"

} insertsql := fmt.sprintf("insert into `%s` (%s) values %s", tablename, fieldname, strings.join(valuelist, ",")+";")

return insertsql

}// getformatfield 獲取字段型別值轉為字串

func getformatfield(objv reflect.value, index int, t string, sep string) string else if t == "uint" else if t == "int"

return v

}// getcolumnname 獲取欄位名

func getcolumnname(jsonname string) string

return strings.replace(name, "column:", "", 1)

} return ""

}// batchcreatemodelsbypage 分頁批量插入

func batchcreatemodelsbypage(tx *gorm.db, datalist inte***ce{}, tablename string) (err error)

// 如果超過一百條, 則分批插入

size := 100

page := len(datalist) / size

if len(datalist)%size != 0

for a := 1; a <= page; a++ , 0)

if a == page else

sql := getbranchinsertsql(bills, tablename)

if err = tx.exec(sql).error; err != nil

} return

}

最後會返回批量插入的sql語句, 這樣一來就舒服多了

因為我的朋友 現在型別主要用到了string, int和uint, 如果有其他型別需要加的話在 獲取字段型別和getformatfeild裡面加就行了

如果各位大佬有更好的解決方案希望可以拿出來分享學習一下

關於資料批量入庫解決方案

關於程式批量入庫解決方案 下面小弟關於最近的乙個批量入庫解決辦法與大家分享一下,由於是第一次部落格,有什麼不對,請大家多多指教 最近專案用到了大併發寫資料庫操作,當用只做了單條資料commit一次,這樣做插入會很慢,資料庫的壓力也很大,當時自己的第乙個想法就是改變提交方式,10條或100條提交一次,...

批量錄入快遞位址解決方案

電商 erp等軟體系統下單環節,批量錄入收件人資訊及位址,通常會碰到諸如位址不完整 位址不規範 收件人資訊與位址寫一起需要區分開 逐個錄入效率過低等問題。下面介紹幾個批量錄入收件人資訊及位址的解決方案。收件人資訊有誤場景 1.收件人資訊填寫不完整,如 四川成華區和美西路19號,李一,13512341...

關於資料批量入庫解決方案

關於程式批量入庫解決方案 下面小弟關於最近的乙個批量入庫解決辦法與大家分享一下,由於是第一次部落格,有什麼不對,請大家多多指教 最近專案用到了大併發寫資料庫操作,當用只做了單條資料 commit 一次,這樣做插入會很慢,資料庫的壓力也很大 當時自己的第乙個想法就是改變提交方式,10 條或 100 條...