定制开发Gorm-批量插入问题

问题描述

使用Gorm操纵MySQL数据库,定制开发在初始化项目时,定制开发需要向某个表t1定制开发插入若干条原始数据。

此外,定制开发初始化函数在每次执行时都会执行;因此,初始化操作中的Insert应该是Upsert操作,或者是FirstOrCreate操作

问题1:Gorm中对Upsert的支持并不友好

  • Gorm调用Mysql的on duplicate key upset 语法实现 Upsert
  • mysql数据库下,只会比较表的唯一索引(包括主键)来判断记录是否重复;因此MySQL中的Upsert需要结合唯一索引使用,在结构体定义中使用gorm:"uniqueIndex:xxxx"

问题2:Gorm中FirstOrCreate不支持批量插入;Create支持批量插入

  • 传入的参数是的不定长切片,调用FirstOrCreate会失败

  • FirstOrCreate描述:Get first matched record or create a new one with given conditions (only works with struct, map conditions)

解决办法

        1. 结合唯一索引,定义一个UpsetOrCreate,封装实现Upsert的功能

参考如下:

12345
  1. db.Model(&ModelName{}).Clauses(clause.OnConflict{
  2. //
  3. Columns: []clause.Column{{Name: "name"}, {Name: "class_id"}},
  4. DoUpdates: clause.AssignmentColumns([]string{"name", "class_id"}),
  5. }).Create(modelObjects)
  • 注:在MySQL中使用OnConfict单纯指定冲突检查列Columns其实无用;还需要保证这些列关联唯一索引

        2. 循环调用FirstOrCreate

传入参数为不定长的切片,所以使用for循环

123
  1. for i:=0;i<len(rows);i++{
  2. db.Debug().Model(&ModelName{}).Where(&ModelName{Col: rows[i].Col}).FirstOrCreate(row[i])
  3. }
  • 注:需要指定where条件,使gorm可以根据where条件查重
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发