大项目第一天|青训营

87 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

在做大项目的时候发现gorm掌握的不够熟练,此笔记用来记录今日学习并且用到了的内容。

选方向

通过研究接口文档和项目结构之后,了解到至少需要实现互动和社交两个方向之一,因为菜菜所以打算选其中之一。通过和队友的研究分析,发现第一个方向的需要实现的接口比较简单,只需要在数据库中多增加两个对象就可以了,第二个方向不仅有类似的关注操作,还有在飞书群上常出现问题的聊天系统需要完成。综上考虑,所以最后选择了互动接口进行实现。

数据库的设计

  • 使用工具 powerdesigner
  • 通过分析我们可以知道,一共有四个对象,分别是用户、视频、评论、点赞,用户可以发布多个视频,所以用户和视频之间是一对多的关系,用户可以评论和点赞多个视频,视频可以被多个用户评论与点赞,所以都是一对多的关系。根据上面分析,创建概念模型,导出逻辑模型、物理模型,再新建数据库与对应表。

image.png

Gorm学习

安装

go get -u gorm.io/gorm 
go get -u gorm.io/driver/sqlite 

查询

  • 检索单个对象
    GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误
// 获取第一条记录(主键升序) 
db.First(&user) 
// SELECT * FROM users ORDER BY id LIMIT 1; 

// 获取一条记录,没有指定排序字段 
db.Take(&user) 
// SELECT * FROM users LIMIT 1;

// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
  • 根据主键检索
    第二个参数就是需要查询主键的值,如果第二个参数为列表,那么返回的就会是id存在在该列表里面的所有对象
db.First(&user, 10) 
// SELECT * FROM users WHERE id = 10;  

db.First(&user, "10") 
// SELECT * FROM users WHERE id = 10; 

db.Find(&users, []int{1,2,3}) 
// SELECT * FROM users WHERE id IN (1,2,3); 

调用数据库

为了更快速的完成项目,我们选择的是用gorm调用mysql代码,根据返回对象进行调整之后,再返回给客户端,这种方式可以让我们的小组合作更加高效,所以选择了该方式,如下:

user_id := c.Query("user_id")

var user User
err := dal.DB.Raw("CALL user_info(?)", user_id).Scan(&user).Error
if err != nil {
   c.JSON(http.StatusOK, UserResponse{
      Response: Response{StatusCode: 1, StatusMsg: "User doesn't exist"},
   })
} else {
   c.JSON(http.StatusOK, UserResponse{
      Response: Response{StatusCode: 0},
      User:     user,
   })
}

明日安排

今天jwt验证方面遇到了一点小困难,希望明天加快进度。