Gorm 多个 Select 查询动态地拼 Sql

发布于 2022-02-06 13:01:24 字数 1667 浏览 1672 评论 0

在代码里,如果我想 select 的数量是不确定的,是根据一个传入的列表动态决定的,有可能是6个数有可能是8个数,这时有可能会想到动态地拼 gorm 的 select 语句:

var db *gorm.DB
var conditionList [][]int32 // 省略初始化
for _, val := range conditionList {
    db = db.Select("count(product_type in (?), orders.id, null))", val)
}

也就是,拼出来之后得到一个类似这样的 gorm 语句:

db = db.Select("count XXX").Select("count XXX").Select(......)

但是 ,这样运行之后会发现实际的 sql 语句只会有一个 select,其他的 select 都没有了,相当于只剩下:

db = db.Select("count XXX")

这是因为在 gorm 里 select 只能指定(assign)一次。所以剩下的方法就是,自己拼一个大的字符串形式的 select 语句:

var db *gorm.DB
var conditionList [][]int32 // 省略初始化
selectSql := ""
for _, val := range conditionList {
    if len(selectSql) == 0 {
        selectSql += fmt.Sprintf("count(product_type in (%v), orders.id, null))", val)
    } else {
        selectSql += fmt.Sprintf(",count(product_type in (%v), orders.id, null))", val)
    }
}
db = db.Select(selectSql)

当然,这样直接拼字符串会有 sql 注入的风险,更好的方法是使用 gorm 自带的拼接,实现方式是把动态条件统一放到一个 interface{} 的列表中,比如:

var db *gorm.DB
var conditionList [][]int32 // 省略初始化
selectSql := ""
selectCondition := make([]interface{}, 0)
for _, val := range conditionList {
    if len(selectSql) == 0 {
        selectSql += "count(product_type in (?), orders.id, null))"
    } else {
        selectSql += ",count(product_type in (?), orders.id, null))"
    }
    selectCondition = append(selectCondition, val)
}
db = db.Select(selectSql, selectCondition...)

这样就能动态地拼接多个 select 语句了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

文章
评论
84963 人气
更多

推荐作者

夢野间

文章 0 评论 0

doggiejohn

文章 0 评论 0

就此别过

文章 0 评论 0

初见终念

文章 0 评论 0

qq_rvKjBH

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文