gpt4 book ai didi

go - 使用 Cassandra GOCQL 驱动程序 (Golang) 确定页面状态

转载 作者:数据小太阳 更新时间:2023-10-29 03:20:23 25 4
gpt4 key购买 nike

我一直在努力思考如何使用 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
}
}

关于go - 使用 Cassandra GOCQL 驱动程序 (Golang) 确定页面状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54929208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com