我一直试图围绕如何在 Apache Cassandra 中使用 GOlang 中的驱动程序函数进行分页。
我有以下用于获取行的代码
/// Assume all other prerequisites.
session, _ := cluster.CreateSession()
session.SetPageSize(100)
var pagestate []byte
query := session.Query(`select * from keyspace.my_table`)
query = query.PageState(pagestate)
if err := query.Exec(); != nil {
panic(err)
}
iter := query.Iter()
for {
row := map[string]interface{}{}
if !iter.MapScan(row) {
pagestate = iter.PageState()
break
}
/// Do whatever I need with row.
}
我要实现的目标: 我引用的表很大,超过 18k 行,我想使用驱动程序的内置分页以最有效的方式获取所有表以进行特殊操作,这样查询就不会了t 超时。
问题: 我不确定如何让查询恢复到前一页状态。我不确定这是否涉及在循环中运行查询并在其外部管理页面状态。我了解如何获取和设置页面状态,但在所有分页完成后,如果没有适当的停止条件,我无法弄清楚如何每次使用新页面状态迭代查询。
我最好的尝试:
var pagestate []byte
query := session.Query(`select * from keyspace.my_table`)
for {
query = query.PageState(pagestate)
if err := query.Exec(); != nil {
panic(err)
}
iter := query.Iter()
/// I don't know if I'm using this bool correct or not.
/// My assumption is that this would return false when a new page isn't
/// avaliable, thus meaning that all the pages have been filled and
/// the loop can exit.
if !iter.WillSwitchPage() {
break
}
for {
row := map[string]interface{}{}
if !iter.MapScan(row) {
pagestate = iter.PageState()
break
}
/// Do whatever I need with row.
}
}
我这样做是对的,还是有更好的方法来实现这一点?