登录
首页 >  Golang >  Go问答

使用 Golang 中的 Cassandra GOCQL 驱动程序实现页面状态计算

来源:stackoverflow

时间:2024-03-02 12:09:28 359浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《使用 Golang 中的 Cassandra GOCQL 驱动程序实现页面状态计算》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我一直在尝试了解如何使用 golang 中的驱动程序功能在 apache cassandra 中进行分页。

我有以下用于获取行的代码

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

到这里,我们也就讲完了《使用 Golang 中的 Cassandra GOCQL 驱动程序实现页面状态计算》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>