后端实践:使用GORM对数据库进行增删改查(三)查|青训营;

53 阅读2分钟

完成了项目的配置文件,我们就可以开始真正开始进行对数据库的增删改查操作了。由于篇幅原因,本次先讲查。

查询(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没有必要,因为会自动生成):

1692006944127.png

确定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
}
  1. [ ]是一定要有的,因为只有这样返回的才是一个数组。
  2. 此处我们使用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后面,达成传递参数的效果。 注意,一定只能这么传,原因有:

  1. GET方法只认把参数续在path之后的方法,不能用JSON。
  2. Query的函数定义要求这样传递参数

我曾经错误传参,结果失败调用函数了。找了半天bug,才发现是传参方法的问题。 如果正确,返回结果如下:

1692008760328.png 返回一个数组,查询成功。