开发者社区 问答 正文

Go-SDK的多行数据操作

表格存储的 SDK 提供了 BatchGetRow、BatchWriteRow、GetRange 和 GetByIterator 等多行操作的接口。

批量读(BatchGetRow)


批量读取一个或多个表中的若干行数据。
BatchGetRow 操作可视为多个 GetRow 操作的集合,各个操作独立执行,独立返回结果,独立计算服务能力单元。
与执行大量的 GetRow 操作相比,使用 BatchGetRow 操作可以有效减少请求的响应时间,提高数据的读取速率。

接口//返回表(Table)中的多行数据。
    //
    // @param BatchGetRowRequest             执行BatchGetRow操作所需参数的封装。
    // @return  BatchGetRowResponse          BatchGetRow操作的响应内容。
    BatchGetRow(request *BatchGetRowRequest) (*BatchGetRowResponse, error)





示例


批量一次读 10 行。 batchGetReq := &tablestore.BatchGetRowRequest{}
mqCriteria := &tablestore.MultiRowQueryCriteria{}
for i := 0; i < 10; i++ {
    pkToGet := new(tablestore.PrimaryKey)
    pkToGet.AddPrimaryKeyColumn("pk1", "pk1value1")
    pkToGet.AddPrimaryKeyColumn("pk2", int64(i))
    pkToGet.AddPrimaryKeyColumn("pk3", []byte("pk3"))
    mqCriteria.AddRow(pkToGet)
    mqCriteria.MaxVersion = 1
}
mqCriteria.TableName = tableName
batchGetReq.MultiRowQueryCriteria = append(batchGetReq.MultiRowQueryCriteria, mqCriteria)
batchGetResponse, err := client.BatchGetRow(batchGetReq)
if err != nil {
    fmt.Println("batachget failed with error:", err)
} else {
    fmt.Println("batchget finished")
}


[backcolor=transparent]说明:
  • 批量读也支持通过条件语句过滤。
  • 详细代码可在 BatchGetRow@GitHub 获取。


批量写(BatchWriteRow)


批量插入、修改或删除一个或多个表中的若干行数据。
BatchWriteRow 操作可视为多个 PutRow、UpdateRow、DeleteRow 操作的集合,各个操作独立执行,独立返回结果,独立计算服务能力单元。

接口// 对多张表(Table)中的多行数据进行增加、删除或者更改操作。
    //
    // @param BatchWriteRowRequest             执行BatchWriteRow操作所需参数的封装。
    // @return  BatchWriteRowResponse          BatchWriteRow操作的响应内容。
    BatchWriteRow(request *BatchWriteRowRequest) (*BatchWriteRowResponse,error)





示例


批量写入100行数据。 batchWriteReq := &tablestore.BatchWriteRowRequest{}
    for i := 0; i < 100; i++ {
        putRowChange := new(tablestore.PutRowChange)
        putRowChange.TableName = tableName
        putPk := new(tablestore.PrimaryKey)
        putPk.AddPrimaryKeyColumn("pk1", "pk1value1")
        putPk.AddPrimaryKeyColumn("pk2", int64(i))
        putPk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
        putRowChange.PrimaryKey = putPk
        putRowChange.AddColumn("col1", "fixvalue")
        putRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE)
        batchWriteReq.AddRowChange(putRowChange)
    }
    response, err := client.BatchWriteRow(batchWriteReq)
    if err != nil {
        fmt.Println("batch request failed with:", response)
    } else {
        fmt.Println("batch write row finished")
    }


[backcolor=transparent]说明:


范围读(GetRange)


读取指定主键范围内的数据。

接口// 从表(Table)中查询一个范围内的多行数据。。
    //
    // @param GetRangeRequest            执行GetRange操作所需参数的封装。
    // @return GetRangeResponse          GetRange操作的响应内容。
    GetRange(request *GetRangeRequest) (*GetRangeResponse,error)





示例


按照范围读取。 getRangeRequest := &tablestore.GetRangeRequest{}
    rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
    rangeRowQueryCriteria.TableName = tableName
    startPK := new(tablestore.PrimaryKey)
    startPK.AddPrimaryKeyColumnWithMinValue("pk1")
    startPK.AddPrimaryKeyColumnWithMinValue("pk2")
    startPK.AddPrimaryKeyColumnWithMinValue("pk3")
    endPK := new(tablestore.PrimaryKey)
    endPK.AddPrimaryKeyColumnWithMaxValue("pk1")
    endPK.AddPrimaryKeyColumnWithMaxValue("pk2")
    endPK.AddPrimaryKeyColumnWithMaxValue("pk3")
    rangeRowQueryCriteria.StartPrimaryKey = startPK
    rangeRowQueryCriteria.EndPrimaryKey = endPK
    rangeRowQueryCriteria.Direction = tablestore.FORWARD
    rangeRowQueryCriteria.MaxVersion = 1
    rangeRowQueryCriteria.Limit = 10
    getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
    getRangeResp, err := client.GetRange(getRangeRequest)
    fmt.Println("get range result is " ,getRangeResp)
    for ; ; {
        if err != nil {
            fmt.Println("get range failed with error:", err)
        }
        if (len(getRangeResp.Rows) > 0) {
            for _, row := range getRangeResp.Rows {
                fmt.Println("range get row with key", row.PrimaryKey.PrimaryKeys[0].Value, row.PrimaryKey.PrimaryKeys[1].Value, row.PrimaryKey.PrimaryKeys[2].Value)
            }
            if getRangeResp.NextStartPrimaryKey == nil {
                break
            } else {
                fmt.Println("next pk is :", getRangeResp.NextStartPrimaryKey.PrimaryKeys[0].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[1].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[2].Value)
                getRangeRequest.RangeRowQueryCriteria.StartPrimaryKey = getRangeResp.NextStartPrimaryKey
                getRangeResp, err = client.GetRange(getRangeRequest)
            }
        } else {
            break
        }
        fmt.Println("continue to query rows")
    }
    fmt.Println("putrow finished")


[backcolor=transparent]说明:
  • 按范围读也支持通过条件语句过滤。
  • 按范围读需要注意数据可能会分页。
  • 详细代码可在 GetRange@GitHub 获取。

展开
收起
云栖大讲堂 2017-10-25 16:49:35 2389 分享 版权
0 条回答
写回答
取消 提交回答