【问题标题】:Golang SQLBoiler returns nothing when running orderby运行 orderby 时,Golang SQLBoiler 不返回任何内容
【发布时间】:2021-07-31 09:52:55
【问题描述】:

我在 Go 上使用 SqlBoiler 向 PostgreSQL 数据库发送请求,但是当尝试通过其中一个字段对数据库进行排序时,它返回 0 行。

首先我运行一个计数(如下详述),如果计数返回多于或等于一行,那么我会查询数据库以获取所有结果。

这会返回正确的行数:

res, _ := models.MT(
        Where("(mt_mas = ? or mt_mem like ?) and mt_group = ?", uint(uid), `%"`+strconv.Itoa(uid)+`"%`, bool(mt_group_bool)),
    ).Count(CTX, DB)

尽管查询参数完全相同,但不会返回任何行:

res, _ := models.MT(
        Where("(mt_mas = ? or mt_mem like ?) and mt_group = ?", uint(uid), `%"`+strconv.Itoa(uid)+`"%`, bool(mt_group_bool)),
        OrderBy(`mt_mas`),
    ).Count(CTX, DB)

这是我在检查行数后获取所有行的方式:

res, err := models.MT(
        Where("(mt_mas = ? or mt_mem like ?) and mt_group = ?", uint(uid), `%"`+strconv.Itoa(uid)+`"%`, bool(mt_group_bool)),
        OrderBy(`mt_mas`),
    ).All(CTX, DB)

当从上面的请求中读取错误时,它会打印出<nil>,一切似乎都很好。

数据库如前所述Postgres(版本PostgreSQL 13.3),列如下:

  • mt_mas(整数)
    此列保存此行所有者的 uid。
  • mt_mem(字符变化 [1000])
    此列包含用户成员 uid:s 的 JSON 列表。
  • mt_group (boolean)
    此列显示此行是不是一组。

数据库行示例:
| mt_mas | mt_mem | mt_group | | :----: | :----: | :--------: | | 1 | {"1", "2"} |假 |

【问题讨论】:

  • 无论如何,您的 Count 查询中都不需要 OrderBy。只有在实际返回行时才使用 OrderBy。
  • @Riverans 通过添加生成的 SQL 来编辑问题,最好是针对所有 3 个查询。要启用生成的 SQL 的日志记录,请参阅:github.com/volatiletech/sqlboiler/blob/…
  • @mkopriva,好主意!我似乎无法让它工作。我可以请你给我举个例子吗?我使用了一个可导出的 DB 和 CTX 变量(在我们自制的数据库包中定义),如上面的代码所示,这可能会引起一些麻烦。 :S
  • @Riverans 如果你不能让它与boil.DebugMode = true 一起工作,那么我不知道。我自己不使用sqlboiler,所以我对它的了解不够深入,无法知道为什么调试对您不起作用以及可以做些什么来使它起作用。
  • @mkopriva, Okok。如果我能提供额外的信息,我会继续尝试。感谢您到目前为止的帮助! :)

标签: postgresql go frameworks sqlboiler


【解决方案1】:

好的,解决方案比预期的要简单。 @Gari Singh (https://stackoverflow.com/users/5529712/gari-singh) 实际上在上面的 cmets 中指出了这一点,但我想我会把它写在这里,这样问题就解决了。

解决方案是简单地不在计算结果的查询中排序。所以正确的计数代码应该只有:

res, _ := models.MT(
        Where("(mt_mas = ? or mt_mem like ?) and mt_group = ?", uint(uid), `%"`+strconv.Itoa(uid)+`"%`, bool(mt_group_bool)),
    ).Count(CTX, DB)

然后运行查询以获取具有顺序的实际行,如下所示:

res, err := models.MT(
        Where("(mt_mas = ? or mt_mem like ?) and mt_group = ?", uint(uid), `%"`+strconv.Itoa(uid)+`"%`, bool(mt_group_bool)),
        OrderBy("mt_mas"),
    ).All(CTX, DB)

感谢您的帮助! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2021-11-22
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多