本文介紹如何通過 Go SDK 範圍讀取Table Store中的資料。
前提條件
方法說明
func (tableStoreClient *TableStoreClient) GetRange(request *GetRangeRequest) (*GetRangeResponse, error)範例程式碼
以下範例程式碼用於讀取 test_table 表中主索引值大於 row1 的資料。
func GetRangeSample(client *tablestore.TableStoreClient) {
// 構造查詢條件
rangeRowQueryCriteria := new(tablestore.RangeRowQueryCriteria)
rangeRowQueryCriteria.TableName = "test_table"
// 設定查詢起始主鍵
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", "row1")
rangeRowQueryCriteria.StartPrimaryKey = startPK
// 設定查詢結束主鍵(返回結果不包含結束主鍵)
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumnWithMaxValue("id")
rangeRowQueryCriteria.EndPrimaryKey = endPK
// 設定查詢版本
rangeRowQueryCriteria.MaxVersion = 1
// 調用 GetRange 方法查詢資料
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// 返回結果處理
if err != nil {
fmt.Println("Range get failed with error: ", err)
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Println("* Rows Data:")
for _, row := range getRangeResponse.Rows {
fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
for _, column := range row.Columns {
fmt.Printf("%v ", column)
}
fmt.Printf("\n")
}
}
}單次範圍掃描資料上限為 5000 行或者 4 MB,超出限制部分的資料將返回用於下一次讀取的起始主索引值,您可以參考以下代碼進行迭代查詢。
for {
// 調用 GetRange 方法查詢資料
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// 返回結果處理
if err != nil {
fmt.Println("Range get failed with error: ", err)
break
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Printf("* Rows Count: %d \n", len(getRangeResponse.Rows))
fmt.Println("* Rows Data:")
for _, row := range getRangeResponse.Rows {
fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
for _, column := range row.Columns {
fmt.Printf("%v ", column)
}
fmt.Printf("\n")
}
}
// 設定下一次讀取資料起始主鍵
if getRangeResponse.NextStartPrimaryKey != nil {
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", getRangeResponse.NextStartPrimaryKey.PrimaryKeys[0].Value)
rangeRowQueryCriteria.StartPrimaryKey = startPK
} else {
break
}
}您也可以在查詢資料時參考範例程式碼進行以下設定。
設定資料讀取方向。
// 設定反向讀取資料 rangeRowQueryCriteria.Direction = tablestore.BACKWARD // 設定查詢起始主鍵,反向讀取資料時,起始主鍵要大於結束主鍵 startPK := new(tablestore.PrimaryKey) startPK.AddPrimaryKeyColumnWithMaxValue("id") rangeRowQueryCriteria.StartPrimaryKey = startPK // 設定查詢結束主鍵,返回結果不包含結束主鍵 endPK := new(tablestore.PrimaryKey) endPK.AddPrimaryKeyColumn("id", "row1") rangeRowQueryCriteria.EndPrimaryKey = endPK設定讀取的資料版本範圍,結果只返回版本範圍內的資料。
// 設定查詢的資料版本範圍為目前時間往前一天 timeRange := new(tablestore.TimeRange) timeRange.Start = int64(time.Now().Unix() * 1000 - 86400 * 1000) timeRange.End = int64(time.Now().Unix() * 1000) rangeRowQueryCriteria.TimeRange = timeRange;指定讀取的屬性列。
rangeRowQueryCriteria.AddColumnToGet("col1")設定單次返回最大行數。
rangeRowQueryCriteria.Limit = 10