Golang批量更新数据进mysql数据库操作

Golang批量更新数据进mysql数据库操作

前言

因最近项目需要,在模版表对应的字段表中存在一对多关系,需要根据模版id批量插入字段表中多条字段数据,于是记录一下实现步骤
项目运用go :1.16.3版本;xorm数据库;gin框架结构;数据库mysql

结构体

数据结构体

// 模版信息
type Template struct {
	TemplateId   int64  `json:"template_id" xorm:"template_id"`     //模版ID,雪花
	TemplateName string `json:"template_name" xorm:"template_name"` //模版名称
...... 省略部分字段
	Created      int64  `json:"created" xorm:"created"`             //创建时间
	Updated      int64  `json:"updated" xorm:"updated"`             //更新时间
}

// 模版字段表
type Field struct {
	FieldId         int64  `json:"field_id" xorm:"field_id"`                   //字段ID,雪花
	TemplateId      int64  `json:"template_id" xorm:"template_id"`             //模版ID
	FieldName       string `json:"field_name" xorm:"field_name"`               //字段名
	FieldType       int8   `json:"field_type" xorm:"field_type"`               //字段类型,0:int,2:string,3:boolean
...... 省略部分字段
	Describe        string `json:"describe" xorm:"describe"`                   //字段描述
	CreatorId       int64  `json:"creator_id" xorm:"creator_id"`               //创建者ID
	Created         int64  `json:"created" xorm:"created"`                     //创建时间
	Updated         int64  `json:"updated" xorm:"updated"`                     //更新时间
}

参数结构体

其他前端传入结构体

type Fields struct {
	Fields []*Field `json:"fields"` // 多个字段对象
}

路由

路由实现转发
省略用户相关和token获取拦截相关

fieldRouter := apiV1.Group("/field")
{
	// 新增模版对应字段基础信息
	fieldRouter.POST("/createField", apictl.CreateField)
}

控制层

// CreateField 新增模版对应字段基础信息
func CreateField(c *gin.Context) {
	appG := app.Gin{C: c}
	//1.解析Fields Body参数
	fieldBody := new(models.Fields)
	var err error
	if err = c.ShouldBindJSON(fieldBody); err != nil {
		appG.Response(models.ErrorArgs, "参数错误", fmt.Sprintf("参数出错%s", err.Error()))
		return
	}
	// 获取Fields
	fields := fieldBody.Fields
	numberLen := len(fields)
	// 解析token获取用户id
	userId := c.MustGet("userId")
	for i := 0; i < numberLen; i++ {
		//添加模版对应字段创建雪花id
		fields[i].FieldId = snowflakeId.GetIdInt()
		//添加模版对应字段创建用户id
		fields[i].CreatorId = userId.(int64)
		//添加模版对应字段创建时间
		fields[i].Created = time.Now().Unix()
	}

	// 批量插入字段数据
	field := new(models.Field)
	//事务开始
	session := db.GetEngine().NewSession()
	defer session.Close()
	err = session.Begin()
	number, err := field.Insert(session, fields)
	if err != nil || int(number) != numberLen {
		session.Rollback()
		appG.Response(models.ErrorInsert, "批量新增模版对应字段写入数据库出错", err.Error())
		return
	}
	// 事务提交
	if err = session.Commit(); err != nil {
		session.Rollback()
		appG.Response(models.ErrorInsert, "批量新增模版对应字段事务提交出错", err.Error())
		return
	}
	appG.Response(models.Success, "成功", "模版对应字段创建成功")
}

数据库操作


// 批量插入字段记录
func (f *Field) Insert(session *xorm.Session, fields []*Field) (int64, error) {
	var err error
	var affected int64
	if session != nil {
		affected, err = session.Insert(&fields)
	} else {
		engine := db.GetEngine()
		affected, err = engine.Insert(&fields)
	}
	if err != nil {
		return 0, err
	}
	return affected, nil
}

postman参数和效果

json参数

{
    "fields": [
        {
            "template_id": 386180276755107840,
            "field_name": "证件名",
            "field_type": 2,
           ...... 省略部分字段
            "describe": "证件的名称"
        },{
            "template_id": 386180276755107840,
            "field_name": "证件hash",
            "field_type": 2,
            ...... 省略部分字段
            "describe": "证件hash"
        },{
            "template_id": 386180276755107840,
            "field_name": "证件保存地址",
            "field_type": 2,
    		...... 省略部分字段
            "describe": "证件保存地址"
        }
    ]
}

返回效果

{
    "code": 0,
    "msg": "成功",
    "data": "模版对应字段创建成功"
}

截图效果

Golang批量更新数据进mysql数据库操作

上一篇:CmsWing源码分析(九)


下一篇:Windows 10-限制Windows更新上传带宽