rawQuery := "SELECT num FROM UNNEST(GENERATE_ARRAY(1, 25)) num;"
query := bqClient.Query(rawQuery)
it, err := query.Read(ctx)
if err != nil {
panic(err) // for brevity
}
for {
var row myObject
it.PageInfo().Token = token
if err := it.Next(&row); err != nil {
if errors.Is(err, iterator.Done) {
break
}
return nil, "", err
}
nextToken = it.PageInfo().Token
out = append(out, row)
token = nextToken
}
文档here读起来像PageInfo().Token
的值应该每N
(在本例中为5)更改一次,或者简单地说,每一个新页面都应该更改一次。
然而,发生的情况是迭代器只是不断地向我的切片(out)追加行,即使在内部我可以看到有一个名为“rows”的字段,其缓冲区为N
。
我想实现的是批量阅读BQ中的行,这样我就可以指定MaxSize
和一个空字符串token
,然后通过更新token
的值来执行某种基于光标的分页。出于某种原因,目前它并不这样工作。
1条答案
按热度按时间v6ylcynt1#
事实是,库生成的标记在字典上如此相似,以至于我被愚弄了。
详细说明一下解决方案:为了在BigQuery中实现基于指针的分页,我们可以做以下事情:
1.以
token
的空字符串开始,设置iterator.PageInfo().MaxSize = pageSize
(幸运的是,这是可配置的)1.迭代
iterator.Next(&dst)
并将每个dst
追加到最后的sliceOfDst
,只要len(sliceOfDst) < pageSize
1.获取
iterator.PageInfo().Token
的新值并再次从(1)开始,这次是在将`iterator.PageInfo().Token设置为该值之后这个流程对我来说工作得很好,允许批量处理一个大表,而不需要使用基于limit/offset的分页。