我有以下代码:
cluster := gocql.NewCluster("our-cass")
cass, err := cluster.CreateSession()
defer cass.Close()
iter := cass.Query(`SELECT * FROM cmuser.users LIMIT 9999999999;`).Iter()
c :=iter.Columns()
scanArgs := make([]interface{}, len(c))
for i:=0; i < len(scanArgs); i++ {
scanArgs[i] = makeType(c[i])
}
for iter.Scan(scanArgs...) { ... }
问题是我们在该表中有太多行,但是我需要读取所有行,才能将数据迁移到另一个数据库。有没有办法从Cassandra stream提取数据?不幸的是,我们没有针对表主键的序列,我们为PK使用了uuid,因此这意味着我们无法对循环进行简单的2技巧,即增加一个计数器并遍历所有这样的行..
Gocql有一些用于分页的选项(假设您的Cassandra版本至少是版本2)。
Gocql的Session
具有方法SetPageSize
:https://godoc.org/github.com/gocql/gocql#Session.SetPageSize
并且Gocql的Query
具有类似的方法,PageSize
:https://godoc.org/github.com/gocql/gocql#Query.PageSize
这可以帮助您分解查询。代码如下所示:
cluster := gocql.NewCluster("our-cass")
cass, err := cluster.CreateSession()
defer cass.Close()
iter := cass.Query(`SELECT * FROM cmuser.users;`).PageSize(5000).Iter()