因最近项目需要,在模版表对应的字段表中存在一对多关系,需要根据模版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 }
{ "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": "模版对应字段创建成功" }