微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GORM 中的 sql.Named 参数来构建子句

如何解决GORM 中的 sql.Named 参数来构建子句

我正在使用 GORM 来查询这样的数据库

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.Sprintfstrings.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 举报,一经查实,本站将立刻删除。