ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-12-03 16:58:00  阅读:642  来源: 互联网

标签:err 模版 数据库 Golang field json mysql xorm id


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": "模版对应字段创建成功"
}

截图效果

在这里插入图片描述

标签:err,模版,数据库,Golang,field,json,mysql,xorm,id
来源: https://blog.csdn.net/ic_xcc/article/details/121702212

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有