[golang]如何使用 gorm 高效執行批量插入 (可以透過 Create()、CreateInBatches(),或者 原生 SQL 語句 來提升效率)

 

方法 1:使用 CreateInBatches()(推薦)

CreateInBatches() 是 gorm 提供的批量插入方法,支援設定單批次的筆數,適合大規模資料寫入。

範例

package main
import ( "log" "gorm.io/driver/mysql" "gorm.io/gorm" ) type User struct { ID uint `gorm:"primaryKey"` Name string Age int } func main() { dsn := "user:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal("資料庫連接失敗:", err) } // 準備批量插入的資料 var users []User for i := 1; i <= 1000; i++ { users = append(users, User{Name: "User" + string(i), Age: 20 + (i % 10)}) } // 批量插入,每批 100 筆 if err := db.CreateInBatches(users, 100).Error; err != nil { log.Fatal("批量插入失敗:", err) } else { log.Println("批量插入成功!") } }

優勢

  • 可控每批插入筆數,減少單次 SQL 負擔(如 100 筆一批)。
  • 支援事務,避免部分插入失敗導致數據不一致。

限制

  • CreateInBatches() 會執行 多次 SQL 語句,並非一次性批量插入。


方法 2:使用 Create()(小批量可用)

如果批量插入的筆數較少(如小於 500 筆),可以直接使用 Create(),因為 gorm 會自動優化成批量 SQL

範例

db.Create([]User{
{Name: "Alice", Age: 25}, {Name: "Bob", Age: 30}, {Name: "Charlie", Age: 22}, })

優勢

  • 簡單易用,適合小批量數據插入。

限制

  • gorm 內部會將多條 INSERT 合併執行,但當筆數超過一定限制時,仍會拆分成多次 SQL,影響效率。


方法 3:使用 gorm 原生 SQL

對於 大量數據插入(上萬筆),可以直接使用 原生 SQL 語句,這是最快的方法,因為可以控制 SQL 執行的行為。

範例

values := []string{}
for i := 1; i <= 1000; i++ { values = append(values, fmt.Sprintf("('%s', %d)", "User"+string(i), 20+(i%10))) } sql := "INSERT INTO users (name, age) VALUES " + strings.Join(values, ",") db.Exec(sql)

優勢

  • 一次性插入所有數據,SQL 效率最高。
  • 完全控制 SQL 語法,可以使用 ON DUPLICATE KEY UPDATE 或 IGNORE,防止重複插入。

限制

  • 需要手動構造 SQL,較為繁瑣,但能提供最佳性能。


方法 4:使用 gorm 事務(確保數據一致性)

如果插入過程中發生錯誤,應該使用事務確保數據一致性。

範例

tx := db.Begin() // 開始事務
defer func() { if r := recover(); r != nil { tx.Rollback() // 回滾事務 } }() // 批量插入 users := []User{ {Name: "Tom", Age: 26}, {Name: "Jerry", Age: 28}, } if err := tx.CreateInBatches(users, 100).Error; err != nil { tx.Rollback() // 插入失敗則回滾 log.Println("插入失敗:", err) } else { tx.Commit() // 插入成功則提交 log.Println("批量插入成功!") }

優勢

  • 確保數據完整性,如果插入失敗,可以回滾數據。
  • 適合銀行、訂單等場景,避免部分數據寫入成功,部分失敗導致數據不一致。


哪種方法最快?

方法適用場景優勢缺點
Create()小批量(少於 500 筆)簡單易用,gorm 內部會優化當數據過多時,SQL 會拆分影響性能
CreateInBatches()中等批量(500~100000 筆)控制批次大小,避免單次 SQL 過大仍會執行多次 SQL,不是最優解
原生 SQL大規模批量(10 萬筆以上)最高效,單次 SQL 插入大量數據需要手動構造 SQL
事務插入確保數據一致性失敗可回滾,不會有部分成功、部分失敗的問題事務操作會增加額外開銷


總結

  1. 少量數據(小於 500 筆) → Create()
  2. 中等數據(500 ~ 100000 筆) → CreateInBatches()
  3. 大規模數據(10 萬筆以上) → Exec() 原生 SQL
  4. 需要事務確保一致性 → Begin() / Commit() / Rollback()

留言

這個網誌中的熱門文章

[Kotlin]如何學習Kotlin

[Kotlin]Kotlin Multiplatform (KMP) 如何安裝使用和部署