使用Cassandra GOCQL驱动程序(Golang)找出页面状态

时间:2019-02-28 15:34:33

标签: go cassandra gocql page-state

我一直在努力探索如何在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行,我想使用驱动程序的内置分页以最有效的方式获取所有表以进行特殊操作,以使查询不会超时。

问题: 我不确定如何使查询恢复到上一页状态。我不确定这是否涉及在循环中运行查询并在其外部管理页面状态。我了解如何获取和设置页面状态,但我想不通如何在所有分页完成后没有适当的暂停条件的情况下每次使用新的页面状态来迭代查询。

我的最佳尝试:

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

我这样做正确吗,还是有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

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

无论如何,我通过在查询循环中检查页面状态本身的[] byte来找到解决方案。如果驱动程序到达末尾并且没有填充页面,则页面状态将包含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
   }
}
相关问题