全部產品
Search
文件中心

Tablestore:範圍讀取資料

更新時間:Apr 01, 2026

本文介紹如何通過 Go SDK 範圍讀取Table Store中的資料。

前提條件

初始化Tablestore Client

方法說明

func (tableStoreClient *TableStoreClient) GetRange(request *GetRangeRequest) (*GetRangeResponse, error)

GetRangeRequest參數說明

  • RangeRowQueryCriteria(必選)*RangeRowQueryCriteria:範圍讀取資料資訊,包含以下參數。

    名稱

    類型

    說明

    TableName(必選)

    string

    資料表名稱。

    StartPrimaryKey(必選)

    *PrimaryKey

    起始主鍵資訊,包括主鍵列名稱和主索引值。

    • 返回資料包含起始主鍵。

    • 主鍵個數和類型必須與資料表的主鍵保持一致。

    • 正向讀取資料時,起始主鍵必須小於結束主鍵。

    • 反向讀取資料時,起始主鍵必須大於結束主鍵。

    • AddPrimaryKeyColumnWithMinValue 表示無限小,AddPrimaryKeyColumnWithMaxValue 表示無限大。

    EndPrimaryKey(必選)

    *PrimaryKey

    結束主鍵資訊,包括主鍵列名稱和主索引值。

    • 返回資料不包含結束主鍵。

    • 主鍵個數和類型必須與資料表的主鍵保持一致。

    • AddPrimaryKeyColumnWithMinValue 表示無限小,AddPrimaryKeyColumnWithMaxValue 表示無限大。

    Direction(可選)

    Direction

    讀取方向。

    • FORWARD:預設值,正向讀取資料。

    • BACKWARD:反向讀取資料。

    MaxVersion(可選)

    int32

    最大版本數。

    • 必須設定最大版本數和版本範圍的其中一個。

    • 如果符合查詢條件的資料版本數量超過設定的最大版本數,按從新到舊的順序返回指定版本數量的資料。

    TimeRange(可選)

    *TimeRange

    資料版本範圍。

    • 必須設定最大版本數和版本範圍的其中一個。

    • Table Store資料表的每個屬性列可以有不同的資料版本,設定版本範圍後,僅返回版本範圍內的資料。

    Limit(可選)

    int32

    單次返回最大行數,必須大於 0。如果符合查詢條件的資料行數大於設定的值,將返回指定的最大行數和用於下一次查詢的起始主索引值。

    ColumnsToGet(可選)

    []string

    指定讀取的資料列,可以是主鍵列或屬性列。

    • 不設定ColumnsToGet時,返回整行資料。

    • 設定ColumnsToGet時,如果讀取的行資料不包含任何指定的資料列,將返回 null。

    Filter(可選)

    ColumnFilter

    過濾條件,詳情請參見過濾器

    • 如果同時設定ColumnsToGet和Filter,先按ColumnsToGet篩選合格資料行,再按Filter條件過濾資料。

    TransactionId(可選)

    *string

    局部事務ID,用於唯一標識局部事務,詳情請參見局部事務

範例程式碼

以下範例程式碼用於讀取 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

相關文檔

批量讀取資料