全部产品
Search
文档中心

表格存储:范围读取数据

更新时间:Mar 31, 2026

本文介绍如何通过 Go SDK 范围读取表格存储中的数据。

前提条件

初始化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

    数据版本范围。

    • 必须设置最大版本数和版本范围的其中一个。

    • 表格存储数据表的每个属性列可以有不同的数据版本,设置版本范围后,仅返回版本范围内的数据。

    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

相关文档

批量读取数据