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