GORM to build子句中的sql.Named参数

GORM to build子句中的sql.Named参数,go,gorm,go-gin,Go,Gorm,Go Gin,我使用GORM查询数据库,如下所示: query := ` SELECT * ... ORDER BY col @colOrder` result := DB.Raw( query, sql.Named("colOrder", "ASC"), ) 我从数据库中得到一个语法错误,因为sql.Named将“ASC”转换为如下字符串: SELECT * ... ORDER BY col 'ASC' 我如何让GORM将其

我使用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
谢谢

根据客户要求,定制订单可以这样做:

query:=`
挑选*
...
从桌子上`
结果:=DB.Raw(查询).Order(“col ASC”)

命名参数用于向查询传递实际数据,因此它将引用字符串并导致错误

对于传递查询本身的位,只要这些字符串不是直接来自用户输入,或者您冒着SQL注入漏洞的风险,就可以使用正常的字符串处理工具go(
fmt.Sprintf
strings.Replace
)修改字符串

不要做

order:=request.Query().Get(“订单”)
查询:=fmt.Sprintf(`SELECT…ORDER BY col%s`,ORDER)
能做的事

订单:=“ASC”
if request.Query().Get(“order”)=“desc”{
order=“DESC”
}
查询:=fmt.Sprintf(`SELECT…ORDER BY col%s`,ORDER)
在使用查询生成器时,您也可以使用
Order
功能执行相同的操作:

query:=db.Model(…)。
...
订单(fmt.Sprintf(“列%s”,订单))。
查找(…)