扩展协议限制为 65535 个参数 - Golang Gorm

extended protocol limited to 65535 parameters - Golang Gorm

提问人:Akhilesh mahajan 提问时间:10/27/2023 更新时间:11/24/2023 访问量:156

问:

我正在使用 golang 中的 Gorm 库来处理数据库(postgres 操作)。

我正在做下面提到的查询以获取一些详细信息。

query = query.Where("id in ?", ids).Find(&dest)

ids 的长度将相当大(超过 100k)

在点击查询时,我收到以下错误。

extended protocol limited to 65535 parameters
  • 我已经尝试了 FindInBatches 函数,但它仍然给出相同的错误。
  • 使用带有限制和偏移的 for 循环是有效的,但消耗太多时间。

有关如何解决此问题的任何建议都会有所帮助。

数据库 PostgreSQL go-gorm

评论

0赞 Laurenz Albe 10/27/2023
这可能永远不会表现良好。无论如何,您应该传递一个作为数组的参数。
0赞 Akhilesh mahajan 10/27/2023
@LaurenzAlbe 我也做过同样的事情。query = 查询。其中(“id in ?”, ids)。find(&dest) 只传递数组。但它只给出了同样的错误。
0赞 Laurenz Albe 10/27/2023
我说的是PostgreSQL数组,而不是Go数组。然后,查询必须使用 。id = ANY (array_value)
0赞 Akhilesh mahajan 10/27/2023
@LaurenzAlbe 是的,我用过。但是,我需要一个优化的解决方案,因为这个 id 数组的长度会随机增长。
0赞 Pavlo Golub 10/29/2023
这些 ID 是什么?你从哪里得到它们?而且,当然,这与 gorm 或任何其他库没有任何关系

答:

0赞 Boris BRESCIANI 11/24/2023 #1

你可以做这样的事情:

type User struct {
    ID string
}

totalUsers := make([]*User, 0, len(ids))
max := 65535 - 1 // safe
for i := 0; i < len(ids); i += max {
    m := i + max
    if len(ids) < m {
        m = len(ids)
    }
    var users []*User
    query.Where("id in ?", ids[i:m]).Find(&users)
    totalUsers = append(totalUsers, users...)
}