我正在使用gorm与postgres数据库进行交互。我正在尝试通过使用DISTINCT ON和this question文档的查询进行ORDER BY,以了解如何做到这一点并不容易。所以我需要以
的形式结束查询 SELECT * FROM (<subquery>) ORDER BY column;
乍一看,我似乎需要使用db.QueryExpr()
将我的查询转换为表达式并围绕它构建另一个查询。然而,似乎gorm没有一种直接指定FROM子句的简单方法。我尝试使用db.Model(expr)
或db.Table(fmt.Sprint(expr))
,但模型似乎完全被忽略,而fmt.Sprint(expr)
并未完全按照我的想法返回。表达式包含一些私有变量。如果我可以将原始查询转换为完全解析的字符串,那么我可以使用db.Table(query)
,但我不确定是否可以在不运行的情况下将查询生成为字符串。
如果我有一个完全构建的gorm查询,如何将其包装在另一个查询中以执行我正在尝试的ORDER BY?
答案 0 :(得分:0)
如果要编写将要执行的原始SQL(包括具有SQL子查询的SQL)并使用gorm将结果添加到对象,可以使用.Raw()
和.Scan()
方法:
query := `
SELECT sub.*
FROM (<subquery>) sub
ORDER BY sub.column;`
db.Raw(query).Scan(&result)
将对象的指针引用传递给.Scan()
,其结构类似于生成的行,与使用.First()
的方式非常相似。 .Raw()
还可以使用查询中的?
将数据添加到查询中,并将值作为逗号分隔的输入添加到函数中:
query := `
SELECT sub.*
FROM (<subquery>) sub
WHERE
sub.column1 = ?
AND sub.column2 = ?
ORDER BY sub.column;`
db.Raw(query, val1, val2).Scan(&result)
有关如何使用SQL构建器的更多信息,.Raw()
和.Scan()
,请查看文档中的示例:http://gorm.io/advanced.html#sql-builder