【问题标题】:Golang SQLBoiler append queries dynamicallyGolang SQLBoiler 动态追加查询
【发布时间】:2021-08-10 18:18:19
【问题描述】:

我正在尝试对我的 Postgres 数据库动态运行查询,但无法完全理解它。

我正在寻找的解决方案是一种我可以动态设置查询的解决方案,也许通过在整个代码中将参数附加到最终查询,然后只执行一个查询实例。

正如标题中提到的,我正在使用 SQLBoiler 与 Postgres 进行交互。

这是我在伪代码中寻找的内容:

final_query := QueryMod{
    Where("(mt_mas = ? or mt_mem like ?) and mt_group = ?", uint(uid), `%"`+strconv.Itoa(uid)+`"%`, bool(mt_group_bool)),
}

if a == 1 {
    final_query = append(final_query, And(" and mt_important = ?", bool(false)))
} else {
    final_query = append(final_query, And(" and mt_ness = ?", bool(true)))
}

res_mt_count, err := models.MTs(
    final_query,
).All(CTX, DB)

感谢一路上的任何帮助! :)

【问题讨论】:

  • 您在尝试使用真实代码实现伪代码时遇到了什么问题?
  • 运行上面的代码时出现以下错误:invalid composite literal type qm.QueryMod on line final_query := QueryMod{
  • QueryMod 是一个接口类型,所以是的,该表达式是非法的。如果你想要一个类型的切片,你只需要在该类型前面加上[]。例如final_query := []QueryMod{Where(...)}.
  • 我试过了,但后来在res_mt_count, err := models.MTs( 行上出现以下错误cannot use final_query (type []qm.QueryMod) as type qm.QueryMod in argument to models.MTs。知道如何前进吗?
  • 您可以声明一个实现QueryMod接口的自定义切片类型。然后使用它而不是 []QueryMod{...} 或继续使用 []QueryMod 但将 final_query 转换为声明的切片类型,然后再将其传递给 MTs。或者,您也可以重新定义 MTs 以接受 []QueryMod 而不仅仅是 QueryMod

标签: postgresql go sqlboiler


【解决方案1】:

mkopriva 通过以下解决方案解决了我的问题:

type QueryModSlice []qm.QueryMod

func (s QueryModSlice) Apply(q *queries.Query) {
    qm.Apply(q, s...)
}

func main() {
    mods := QueryModSlice{
        qm.Where("(mt_mas = ? or mt_mem like ?) and mt_group = ?", uint(uid), `%"`+strconv.Itoa(uid)+`"%`, bool(mt_group_bool)),
    }

    if a == 1 {
        mods = append(mods, qm.And(" and mt_important = ?", bool(false)))
    } else {
        mods = append(mods, qm.And(" and mt_ness = ?", bool(true)))
    }

    res_mt, err := models.MTs(mods).All(CTX, DB)

}

非常感谢! :)

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2021-07-31
    • 2018-02-22
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多