go语言 gin框架学习系列(五):gorm mysql 实现增删改查

148 阅读2分钟

1.增加

router.go

demo.POST("/userAdd", api.UserController{}.UserAdd)

UserController.go

func (con UserController) UserAdd(c *gin.Context) {
    // 获取参数
    name := c.PostForm("name")
    age, _ := strconv.Atoi(c.PostForm("age"))
    sex, _ := strconv.Atoi(c.PostForm("sex"))

    data := model.Stu{Name: name, Age: age, Sex: sex}

    fmt.Println(data)
    res, err := service.CreateUser(&data)
    if err != nil {
       c.JSON(http.StatusBadRequest, gin.H{
          "error": err,
       })
    }
    
    c.JSON(200, gin.H{
       "id": res,
    })
}

service.go

func CreateUser(data *model.Stu) ([]int, error) {
    fmt.Println("service", data)
    return model.Create(data)
}

model/user.go

func Create(data *Stu) ([]int, error) {
    result := Db.Create(data)
    if result.Error != nil {
       return nil, result.Error
    }

    var id []int
    Db.Raw("select LAST_INSERT_ID() as id").Pluck("id", &id)
    
    return id, result.Error
}

2.删

router.go

demo.DELETE("/userDelete/:id", api.UserController{}.UserDelete)

UserController.go

func (con UserController) UserDelete(c *gin.Context) {
    req, _ := strconv.Atoi(c.Param("id"))
    res, err := service.DeleteUser(req)
    if err != nil {
       panic(err)
    }
    c.String(res, "删除成功%d", res)
}

service.go

func DeleteUser(data int) (int, error) {
    return model.Delete(data)
}

model/user.go

func Delete(data int) (int, error) {
    var stu Stu
    result := Db.Delete(&stu, data)
    return 200, result.Error
}

3.改

router.go

demo.PUT("/userUpdate/:id", api.UserController{}.UserUpdate)

UserController.go

func (con UserController) UserUpdate(c *gin.Context) {
    req, _ := strconv.Atoi(c.Param("id"))
    result := response.GetEmptySuccessRsp()
    res, err := service.UpdateUser(req)
    if err != nil {
       panic(err)
    }
    c.String(200, "api Update") 
}

service.go

func UpdateUser(data int) (interface{}, error) {
    return model.Update(data)
}

model/user.go

func Update(data int) (result interface{}, err error) {
    var stu Stu
    result = Db.Model(&stu).Where("id =?", data).Update("name", "花花")
    fmt.Println(result)
    return
}

4.查

router.go

demo.GET("/userList", api.UserController{}.UserList)

UserController.go

func (con UserController) UserList(c *gin.Context) {
    res := service.UserList()
    c.JSON(200, gin.H{
       "data": res,
    })
}

service.go

func UserList() []model.Stu {
    return model.List()
}

model/user.go

func List() []Stu {
    var req []Stu
    result := Db.Find(&req)
    fmt.Println(result)
    return req
}

优化列表返回值为{count:0,list:[]}格式

新建entity/response.go文件

package response

// list返回值结构体
type ListRsp struct {
    Count int64       `json:"count"`
    List  interface{} `json:"list"`
}

router.go

demo.GET("/userList", api.UserController{}.UserList)

UserController.go

func (con UserController) UserList(c *gin.Context) {
    res := service.UserList()
    c.JSON(200, gin.H{
        "count": res.Count,
        "list":  res.List,
    })
}

service.go

func UserList() response.ListRsp {
    return model.List()
}

model/user.go

func List() response.ListRsp {
    var req []Stu
    res := response.ListRsp{
        Count: result.RowsAffected,
        List:  req,
    }
    fmt.Println(result)
    return res
}

gorm mysql 方法总结

// 查找主键升序的第一条数据
mysql: SELECT * FROM users ORDER BY id LIMIT 1  
gorm: db.First(&user)

// 查找主键升序的最后一条数据
mysql:SELECT * FROM users ORDER BY id DESC LIMIT 1
gorm: db.Last(&user)

// 查找id=10的数据
mysql:SELECT * FROM users WHEREID = 10
gorm: db.First(&user, 10)

// 查找所有数据
mysql:SELECT * FROM users
gorm: db.Find(&user)

// 获取第一条匹配的记录
db.Where("name = ?", "haha").First(&user)
// SELECT * FROM users WHERE name = 'haha' ORDER BY id LIMIT 1;

// 获取全部匹配的记录
db.Where("name <> ?", "haha").Find(&users)
// SELECT * FROM users WHERE name <> 'haha';

问题:尝试本地启动前端和后端,使用本地数据库启动项目,无接口权限报错,发现本地role字段为null。测试环境role中有数据。

总结:了解到项目通过第三方的登录流程   前端去第三方服务器请求user信息,用获取到的user部分信息与后端服务的user信息拼接成完整的用户信息,去请求项目接口。

例如:第三方服务器返回user基本信息,包含工号,姓名,部门等。而role是通过后端数据库获取的,这样可得到完整的user信息为(工号,姓名,部门,角色类型),使用完整的user信息才可访问项目的业务数据接口。

image.png