TSINGSEE青犀视频云边端几个智能分析平台作为不同协议的视频流媒体服务平台,都能够进行视频直播、录像、回看、转码分发等功能,已经接入平台的视频通道会在视频广场处。
在EasyDSS的最新项目中,我们发现查询视频广场无数据的问题,但是实际上后台存在数据。
我们随即进行测试,发送以下命令:
### 获取分享文件列表
POST http://localhost:10080/v1/vodFile/shareList
Accept: */*
Cache-Control: no-cache
Content-Type: application/json
{
"start": 0,
"limit": 10
}
最终返回结果如下,只能查询到0个数据。
但是到数据库中查看确实是存在数据的。以下数据中第一行 shared 被选中了,应该将此数据返回到前端。
查看代码如下,并打开调试模式,显示发送的数据库查询语句。
vodFiles := make([]*table.VodFile, 0)
ors := make([]string, 0)
wheres := make([]string, 0)
if like != consts.EmptyString {
likeStr := "'%" + like + "%'"
ors = append(ors, "name like "+likeStr)
}
wheres = append(wheres, "shared = 'true'")
total, err := impl.GetParts(&vodFiles, &ors, &wheres, sort, order, offset, limit)
return &vodFiles, total, err
数据库查询语句为:
将该语句直接使用第三方工具运行后,返回结果为0。EasyDSS视频平台对于数据库操作的框架使用的是gorm库,证明对于gorm关于布尔类型的数据查询使用不正确。
检查数据库语句,在数据库语句中出现了 shared=’true ’,数据库语句应该是 share=true ,去除两边的单引号才能查询成功。
因此尝试直接去除单引号,代码如下:
wheres = append(wheres, "shared = true")
修改成此操作后,后台直接提示查询数据库错误。后台错误为
说明此种修改直接将true作为一个字段进行查询了,因此发生错误,此种修改错误。
查询gorm官方的文档使用方法为
tx.Where("shared = ?", true)
官网建议使用此种方式进行编写,但是因为模块化的原因,修改底层的写法,对于上层的修改工作量比较大,因此不采用此种解决方案。
继续尝试新的解决方案,按照如下方式修改。
wheres = append(wheres, "shared = '1'")
查询数据为1,也就是查询到了数据,该问题即可解决。
但通过该问题我们得知,在系统中直接写 shared=’true’,gorm 会将true直接转换成字符串的形式,因此检索失败。如果修改为 shared=’1’, 1 和布尔类型的true是同一种作用,因此起效。大家如果以后碰到类似gorm的问题,可以参考此种解决方法进行排查。