这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
在做大项目的时候发现gorm掌握的不够熟练,此笔记用来记录今日学习并且用到了的内容。
选方向
通过研究接口文档和项目结构之后,了解到至少需要实现互动和社交两个方向之一,因为菜菜所以打算选其中之一。通过和队友的研究分析,发现第一个方向的需要实现的接口比较简单,只需要在数据库中多增加两个对象就可以了,第二个方向不仅有类似的关注操作,还有在飞书群上常出现问题的聊天系统需要完成。综上考虑,所以最后选择了互动接口进行实现。
数据库的设计
- 使用工具
powerdesigner - 通过分析我们可以知道,一共有四个对象,分别是用户、视频、评论、点赞,用户可以发布多个视频,所以用户和视频之间是一对多的关系,用户可以评论和点赞多个视频,视频可以被多个用户评论与点赞,所以都是一对多的关系。根据上面分析,创建概念模型,导出逻辑模型、物理模型,再新建数据库与对应表。
Gorm学习
安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
查询
- 检索单个对象
GORM 提供了First、Take、Last方法,以便从数据库中检索单个对象。当查询数据库时它添加了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验证方面遇到了一点小困难,希望明天加快进度。