Scylla gocqlx如何实现类似游标的分页
Scylla gocqlx how to implement pagination similar to a cursor
我正在使用 Scylla 保存用户创建的派对。下面的方法 return 是用户创建的参与方列表。我目前 return 所有各方都不允许分页,但我正在尝试为下面的方法实现分页,但我仍然不太了解 Scylla 如何处理分页。
我的猜测是可以将游标传递给查询。基于此 example 看起来 PageState
可用于传递类似于游标的内容。
我将不胜感激一个简短的解释 PageState
是什么,以及我是否应该使用它来完成基于标记的分页。如果可以提供一个示例来说明如何将新 PageState
return 发送到客户端并用于在第二个请求中获取新页面,那也很好。
func (pq *partyQuery) GetByUser(ctx context.Context, uId string) ([]datastruct.Party, error) {
var result []datastruct.Party
stmt, names := qb.
Select(TABLE_NAME).
Where(qb.Eq("user_id")).
ToCql()
err := pq.sess.
Query(stmt, names).
BindMap((qb.M{"user_id": uId})).
PageSize(10).
Iter().
Select(&result)
if err != nil {
log.Println(err)
return []datastruct.Party{}, errors.New("no parties found")
}
return result, nil
}
在此先致谢,感谢您抽出宝贵时间。
编辑
对于任何感兴趣的人,这就是我转换函数以允许分页的方式:
func (pq *partyQuery) GetByUser(ctx context.Context, uId string, page []byte) (result []datastruct.Party, nextPage []byte, err error) {
stmt, names := qb.
Select(TABLE_NAME).
Where(qb.Eq("user_id")).
ToCql()
q := pq.sess.
Query(stmt, names).
BindMap((qb.M{"user_id": uId}))
defer q.Release()
q.PageState(page)
q.PageSize(10)
iter := q.Iter()
err = iter.Select(&result)
if err != nil {
log.Println(err)
return []datastruct.Party{}, nil, errors.New("no parties found")
}
return result, iter.PageState(), nil
}
嗨,这里是 gocqlx 作者。
getUserVideos := func(userID int, page []byte) (userVideos []Video, nextPage []byte, err error) {
q := videoTable.SelectQuery(session).Bind(userID)
defer q.Release()
q.PageState(page)
q.PageSize(itemsPerPage)
iter := q.Iter()
return userVideos, iter.PageState(), iter.Select(&userVideos)
}
您需要将页面状态发送给调用方。
我正在使用 Scylla 保存用户创建的派对。下面的方法 return 是用户创建的参与方列表。我目前 return 所有各方都不允许分页,但我正在尝试为下面的方法实现分页,但我仍然不太了解 Scylla 如何处理分页。
我的猜测是可以将游标传递给查询。基于此 example 看起来 PageState
可用于传递类似于游标的内容。
我将不胜感激一个简短的解释 PageState
是什么,以及我是否应该使用它来完成基于标记的分页。如果可以提供一个示例来说明如何将新 PageState
return 发送到客户端并用于在第二个请求中获取新页面,那也很好。
func (pq *partyQuery) GetByUser(ctx context.Context, uId string) ([]datastruct.Party, error) {
var result []datastruct.Party
stmt, names := qb.
Select(TABLE_NAME).
Where(qb.Eq("user_id")).
ToCql()
err := pq.sess.
Query(stmt, names).
BindMap((qb.M{"user_id": uId})).
PageSize(10).
Iter().
Select(&result)
if err != nil {
log.Println(err)
return []datastruct.Party{}, errors.New("no parties found")
}
return result, nil
}
在此先致谢,感谢您抽出宝贵时间。
编辑
对于任何感兴趣的人,这就是我转换函数以允许分页的方式:
func (pq *partyQuery) GetByUser(ctx context.Context, uId string, page []byte) (result []datastruct.Party, nextPage []byte, err error) {
stmt, names := qb.
Select(TABLE_NAME).
Where(qb.Eq("user_id")).
ToCql()
q := pq.sess.
Query(stmt, names).
BindMap((qb.M{"user_id": uId}))
defer q.Release()
q.PageState(page)
q.PageSize(10)
iter := q.Iter()
err = iter.Select(&result)
if err != nil {
log.Println(err)
return []datastruct.Party{}, nil, errors.New("no parties found")
}
return result, iter.PageState(), nil
}
嗨,这里是 gocqlx 作者。
getUserVideos := func(userID int, page []byte) (userVideos []Video, nextPage []byte, err error) {
q := videoTable.SelectQuery(session).Bind(userID)
defer q.Release()
q.PageState(page)
q.PageSize(itemsPerPage)
iter := q.Iter()
return userVideos, iter.PageState(), iter.Select(&userVideos)
}
您需要将页面状态发送给调用方。