完成了项目的配置文件,我们就可以开始真正开始进行对数据库的增删改查操作了。由于篇幅原因,本次先讲查。
查询(select)
本次查询的目的是显示所有在本视频下的评论,即通过视频id查找一个评论数组。
处理数据库
我们为了能够查询出内容,先要用SQL语言对数据库进行操作,否则查询之后结果为空和查询失败会显示相同的内容。 建立数据库和脚本之后代码如下:
insert into comment_entities values(12,'1','1','泰裤辣','2023-08-04');
insert into comment_entities values(1,'1','1','ye','2023-08-04');
表格如下(create table没有必要,因为会自动生成):
确定Service层
我们要完成的查询语句是:
select * from comment_entities ce where video_id=1;
因此,确立函数:
func GetVideoComment(videoId int) []Entity.CommentEntity {
var (
comments []Entity.CommentEntity
)
//CommentDbService.Db.Where(&Entity.CommentEntity{VideoId: videoId}).First(&comment)
CommentDbService.Db.Where("video_id = ?", videoId).Find(&comments)
print("DB has been visited")
return comments
}
- [ ]是一定要有的,因为只有这样返回的才是一个数组。
- 此处我们使用find是遵循课程中老师的建议,避免出现难以发现的bug。
确立Controller层
controller负责规定接受的参数,并把参数调整为希望的格式传递给service。下面的代码就进行了调整。vId是string类型,所以要调整为int类型才能进行传递。
func GetVideoComment(c *gin.Context) {
//uId := c.Query("UserId")
vId := c.Query("VideoId")
//day := c.Query("Calendar")
//var err error
//con := c.Query()
if vId == "" {
ApiState.ArgErrApiResult(c, "videoId")
return
}
v, _ := strconv.Atoi(vId)
comment := CommentService.GetVideoComment(v)
print("comment has returned")
ApiState.ResponseSuccess(c, comment)
}
设置路径
不同于我之前制作的java,本次的路径设置统一设置于Routers中。
我们先来计算一下path:
http://localhost:9180是一定有的,这来自上一篇笔记当中的.ini文件,它规定了客户端访问的端口号。
然后,我们可以进行代码的如下设置:
func Init(router *gin.Engine) {
comment := router.Group("Comment") //这看情况改成douyin
router.RedirectFixedPath = true
{
comment.GET("/douyin/comment/list", CommentController.GetVideoComment)
}
serverConfig := ConfigService.GetServerConfig()
router.Run(serverConfig.HTTP_PORT) // 监听并在 localhost:9180 上启动服务
}
由于我们有:
comment := router.Group("Comment")这一句,因此path延长为
http://localhost:9180/Comment,之后我们设定了GET方法,因此path再度延长为:
http://localhost:9180/Comment/douyin/comment/list。
查询的检验
本次查询检验不使用测试代码,而利用postman进行测试:
http://localhost:9180/Comment/douyin/comment/list?VideoId=1
将要传递的参数用
?连在path后面,达成传递参数的效果。
注意,一定只能这么传,原因有:
- GET方法只认把参数续在path之后的方法,不能用JSON。
- Query的函数定义要求这样传递参数
我曾经错误传参,结果失败调用函数了。找了半天bug,才发现是传参方法的问题。 如果正确,返回结果如下:
返回一个数组,查询成功。