1

私は、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.

}

私が達成しようとしていること: 私が参照しているテーブルは巨大で、18,000 行を超えています。ドライバーの組み込みページングを使用して最も効率的な方法で特別な操作のためにそれらすべてをフェッチして、クエリが実行されないようにしたいのです。タイムアウトします。

問題: 前のページの状態でクエリを再開する方法がわかりません。これがループ内でクエリを実行し、その外側でページの状態を管理することを含むかどうかはわかりません。ページの状態を取得および設定する方法は理解していますが、すべてのページングが完了すると、適切な停止条件がなければ、毎回新しいページの状態でクエリを反復する方法がわかりません。

私の最善の試み:

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

私はこれを正しく行っていますか、それともこれを達成するためのより良い方法はありますか?

4

1 に答える 1