使用Cassandra GOCQL驱动程序(Golang)计算页面状态

使用Cassandra GOCQL驱动程序(Golang)计算页面状态,go,cassandra,gocql,page-state,Go,Cassandra,Gocql,Page State,我一直在想ApacheCassandra中的分页和GOlang中的驱动程序是如何工作的 我有以下获取行的代码 /// Assume all other prerequisites. session, _ := cluster.CreateSession() session.SetPageSize(100) var pagestate []byte query := session.Query(`select * from keyspace.my_table`) query = query

我一直在想ApacheCassandra中的分页和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行,我想使用驱动程序内置的分页以最高效的方式获取所有这些行,以便执行特殊操作,这样查询就不会超时

问题: 我不确定如何使查询恢复到上一页状态。我不确定这是否涉及在循环中运行查询以及在循环之外管理页面状态。我知道如何获取和设置页面状态,但我不知道在所有分页完成后,如果没有适当的停止条件,如何每次使用新页面状态迭代查询

我的最佳尝试:

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.
   }
}

我这样做是对的,还是有更好的方法来实现这一点?

因此,事实证明,
WillSwitchPage()
在循环中的任何点都不会返回true。不知道为什么。我想这是因为我使用
MapScan()
来控制内部循环

无论如何,我找到了一个解决方案,通过在查询循环的末尾检查[]字节的页面状态本身。如果驱动程序到达末尾并且没有填充页面,页面状态将有0个元素,因此我将使用它作为停止条件。这可能是也可能不是处理驱动程序分页的最优雅或最有意的方式,但它的功能符合需要

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()

   for {
      row := map[string]interface{}{}
      if !iter.MapScan(row) {
         pagestate = iter.PageState()
         break
      }

      /// Do whatever I need with row.
   }

   if len(pagestate) == 0 {
      break
   }
}

似乎与这个问题/答案有关。