如何解决GORM 中的 sql.Named 参数来构建子句
query := `
SELECT *
...
ORDER BY col @colOrder`
result := DB.Raw(
query,sql.Named("colOrder","ASC"),)
我从数据库收到语法错误,因为 sql.Named
将“ASC”转换为这样的字符串:
SELECT *
...
ORDER BY col 'ASC'
我怎样才能让 GORM 这样解释它:
SELECT *
...
ORDER BY col ASC
谢谢!
解决方法
根据 documentation 自定义排序可以这样做:
query := `
SELECT *
...
FROM table`
result := DB.Raw(query).Order("col ASC")
,
命名参数用于将实际数据传递给查询,因此它会引用字符串并导致您的错误。
为了传递查询本身的位,您可以使用 go 的普通字符串处理工具(fmt.Sprintf
、strings.Replace
等)修改字符串只要这些字符串不直接来自用户输入,否则您将面临 SQL 注入漏洞的风险。
不要做:
order := request.Query().Get("order")
query := fmt.Sprintf(`SELECT ... ORDER BY col %s`,order)
可以做到:
order := "ASC"
if request.Query().Get("order") == "desc" {
order = "DESC"
}
query := fmt.Sprintf(`SELECT ... ORDER BY col %s`,order)
您也可以在使用查询构建器时对 Order
函数执行相同操作:
query := db.Model(...).
...
Order(fmt.Sprintf("col %s",order)).
Find(...)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。