日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

讀取數(shù)據(jù)

更新時(shí)間:

表格存儲(chǔ)提供了GetRow接口用于讀取單行數(shù)據(jù)以及BatchGetRow、GetRange等接口用于讀取多行數(shù)據(jù)。

如果需要了解表格存儲(chǔ)各場(chǎng)景的應(yīng)用案例,請(qǐng)參見(jiàn)快速玩轉(zhuǎn)Tablestore入門(mén)與實(shí)戰(zhàn)

查詢(xún)方式

表格存儲(chǔ)提供的數(shù)據(jù)讀取接口包括GetRow、BatchGetRowGetRange。讀取數(shù)據(jù)時(shí),請(qǐng)根據(jù)實(shí)際查詢(xún)場(chǎng)景使用相應(yīng)查詢(xún)方式讀取數(shù)據(jù)。

重要

當(dāng)要讀取帶有自增主鍵列的表數(shù)據(jù)時(shí),請(qǐng)確保已獲取到包含自增主鍵列值在內(nèi)的完整主鍵。更多信息,請(qǐng)參見(jiàn)主鍵列自增。如果未記錄自增主鍵列的值,您可以使用范圍讀取數(shù)據(jù)按照第一個(gè)主鍵列確定范圍讀取數(shù)據(jù)。

查詢(xún)方式

說(shuō)明

適用場(chǎng)景

讀取單行數(shù)據(jù)

調(diào)用GetRow接口讀取一行數(shù)據(jù)。

適用于能確定完整主鍵且要讀取行數(shù)較少的場(chǎng)景。

批量讀取數(shù)據(jù)

調(diào)用BatchGetRow接口一次請(qǐng)求讀取多行數(shù)據(jù)或者一次對(duì)多張表進(jìn)行讀取。

BatchGetRow操作由多個(gè)GetRow子操作組成,構(gòu)造子操作的過(guò)程與使用GetRow接口時(shí)相同。

適用于能確定完整主鍵,且要讀取行數(shù)較多或者要讀取多個(gè)表中數(shù)據(jù)的場(chǎng)景。

范圍讀取數(shù)據(jù)

調(diào)用GetRange接口讀取一個(gè)范圍內(nèi)的數(shù)據(jù)。

GetRange操作支持按照確定范圍進(jìn)行正序讀取和逆序讀取,可以設(shè)置要讀取的行數(shù)。如果范圍較大,已掃描的行數(shù)或者數(shù)據(jù)量超過(guò)一定限制,會(huì)停止掃描,并返回已獲取的行和下一個(gè)主鍵信息。您可以根據(jù)返回的下一個(gè)主鍵信息,繼續(xù)發(fā)起請(qǐng)求,獲取范圍內(nèi)剩余的行。

適用于能確定完整主鍵范圍或者主鍵前綴的場(chǎng)景。

重要

如果不能確定主鍵前綴,您也可以通過(guò)設(shè)置完整主鍵范圍均為虛擬點(diǎn)INF_MININF_MAX進(jìn)行全表數(shù)據(jù)掃描,但是執(zhí)行此操作會(huì)消耗較多計(jì)算資源,請(qǐng)謹(jǐn)慎使用。

前提條件

  • 已初始化Client,詳情請(qǐng)參見(jiàn)初始化
  • 已創(chuàng)建數(shù)據(jù)表并寫(xiě)入數(shù)據(jù)。

讀取單行數(shù)據(jù)

調(diào)用GetRow接口讀取一行數(shù)據(jù)。讀取的結(jié)果可能有如下兩種:

  • 如果該行存在,則返回該行的各主鍵列以及屬性列。

  • 如果該行不存在,則返回中不包含行,并且不會(huì)報(bào)錯(cuò)。

接口

//返回表中的一行數(shù)據(jù)。
// @param GetRowRequest             執(zhí)行GetRow操作所需參數(shù)的封裝。
// @return  GetRowResponse          GetRow操作的響應(yīng)內(nèi)容。
GetRow(request *GetRowRequest) (*GetRowResponse, error)                   

參數(shù)

參數(shù)

說(shuō)明

TableName

數(shù)據(jù)表名稱(chēng)。

PrimaryKey

行的主鍵。主鍵包括主鍵列名、主鍵類(lèi)型和主鍵值。

重要

設(shè)置的主鍵個(gè)數(shù)和類(lèi)型必須和數(shù)據(jù)表的主鍵個(gè)數(shù)和類(lèi)型一致。

ColumnsToGet

讀取的列集合,列名可以是主鍵列或?qū)傩粤小?

  • 如果不設(shè)置返回的列名,則返回整行數(shù)據(jù)。

  • 如果設(shè)置了返回的列名,當(dāng)某行中指定的列均不存在時(shí),則不返回該行,即返回值為null;當(dāng)某行中存在部分指定的列時(shí),則返回該行且只返回存在的列。

說(shuō)明
  • 查詢(xún)一行數(shù)據(jù)時(shí),默認(rèn)返回此行所有列的數(shù)據(jù)。如果需要只返回特定列,可以通過(guò)設(shè)置ColumnsToGet參數(shù)限制。如果將col0col1加入到ColumnsToGet中,則只返回col0col1列的值。

  • 當(dāng)ColumnsToGetFilter同時(shí)使用時(shí),執(zhí)行順序是先獲取ColumnsToGet指定的列,再在返回的列中進(jìn)行條件過(guò)濾。

MaxVersion

最多讀取的版本數(shù)。

重要

MaxVersionTimeRange必須至少設(shè)置一個(gè)。

  • 如果僅設(shè)置MaxVersion,則最多返回所有版本中從新到舊指定數(shù)量版本的數(shù)據(jù)。

  • 如果僅設(shè)置TimeRange,則返回該范圍內(nèi)所有數(shù)據(jù)或指定版本數(shù)據(jù)。

  • 如果同時(shí)設(shè)置MaxVersionTimeRange,則最多返回版本號(hào)范圍內(nèi)從新到舊指定數(shù)量版本的數(shù)據(jù)。

TimeRange

讀取版本號(hào)范圍或特定版本號(hào)的數(shù)據(jù)。更多信息,請(qǐng)參見(jiàn)TimeRange

重要

MaxVersionTimeRange必須至少設(shè)置一個(gè)。

  • 如果僅設(shè)置MaxVersion,則最多返回所有版本中從新到舊指定數(shù)量版本的數(shù)據(jù)。

  • 如果僅設(shè)置TimeRange,則返回該范圍內(nèi)所有數(shù)據(jù)或指定版本數(shù)據(jù)。

  • 如果同時(shí)設(shè)置MaxVersionTimeRange,則最多返回版本號(hào)范圍內(nèi)從新到舊指定數(shù)量版本的數(shù)據(jù)。

  • 如果要查詢(xún)一個(gè)范圍的數(shù)據(jù),則需要設(shè)置StartEnd。StartEnd分別表示起始時(shí)間戳和結(jié)束時(shí)間戳,范圍為前閉后開(kāi)區(qū)間,即[Start, End)

  • 如果要查詢(xún)特定版本號(hào)的數(shù)據(jù),則需要設(shè)置Specific。Specific表示特定的時(shí)間戳。

Specific[Start, End)中只需要設(shè)置一個(gè)。

時(shí)間戳的單位為毫秒,最小值為0,最大值為INT64.MAX。

Filter

使用過(guò)濾器,在服務(wù)端對(duì)讀取結(jié)果再進(jìn)行一次過(guò)濾,只返回符合過(guò)濾器中條件的數(shù)據(jù)行。更多信息,請(qǐng)參見(jiàn)過(guò)濾器

說(shuō)明

當(dāng)ColumnsToGetFilter同時(shí)使用時(shí),執(zhí)行順序是先獲取ColumnsToGet指定的列,再在返回的列中進(jìn)行條件過(guò)濾。

示例

以下示例用于讀取一行數(shù)據(jù)。

getRowRequest := new(tablestore.GetRowRequest)
criteria := new(tablestore.SingleRowQueryCriteria);
putPk := new(tablestore.PrimaryKey)
putPk.AddPrimaryKeyColumn("pk1", "pk1value1")
putPk.AddPrimaryKeyColumn("pk2", int64(2))
putPk.AddPrimaryKeyColumn("pk3", []byte("pk3"))

criteria.PrimaryKey = putPk
getRowRequest.SingleRowQueryCriteria = criteria
getRowRequest.SingleRowQueryCriteria.TableName = tableName 
getRowRequest.SingleRowQueryCriteria.MaxVersion = 1  
getResp, err := client.GetRow(getRowRequest)
if err != nil {
    fmt.Println("getrow failed with error:", err)
} else {
    fmt.Println("get row col0 result is ",getResp.Columns[0].ColumnName, getResp.Columns[0].Value,)
}                   

詳細(xì)代碼請(qǐng)參見(jiàn)GetRow@GitHub

批量讀取數(shù)據(jù)

調(diào)用BatchGetRow接口一次請(qǐng)求讀取多行數(shù)據(jù),也支持一次對(duì)多張表進(jìn)行讀取。BatchGetRow由多個(gè)GetRow子操作組成。構(gòu)造子操作的過(guò)程與使用GetRow接口時(shí)相同。

BatchGetRow的各個(gè)子操作獨(dú)立執(zhí)行,表格存儲(chǔ)會(huì)分別返回各個(gè)子操作的執(zhí)行結(jié)果。

注意事項(xiàng)

  • 由于批量讀取可能存在部分行失敗的情況,失敗行的錯(cuò)誤信息在返回的BatchGetRowResponse中,但并不拋出異常。因此調(diào)用BatchGetRow接口時(shí),需要檢查返回值,判斷每行的狀態(tài)是否成功。

  • 批量讀取的所有行采用相同的參數(shù)條件,例如ColumnsToGet=[colA],表示要讀取的所有行都只讀取colA列。

  • BatchGetRow操作單次支持讀取的最大行數(shù)為100行。

參數(shù)

更多信息,請(qǐng)參見(jiàn)讀取單行數(shù)據(jù)參數(shù)

接口

//返回?cái)?shù)據(jù)表(Table)中的多行數(shù)據(jù)。
// @param BatchGetRowRequest             執(zhí)行BatchGetRow操作所需參數(shù)的封裝。
// @return  BatchGetRowResponse          BatchGetRow操作的響應(yīng)內(nèi)容。
BatchGetRow(request *BatchGetRowRequest) (*BatchGetRowResponse, error)                    

示例

以下示例用于批量一次讀取10行數(shù)據(jù)。

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("batchget failed with error:", err)
} else {
    fmt.Println("batchget finished")
}                    

詳細(xì)代碼請(qǐng)參見(jiàn)BatchGetRow@GitHub

范圍讀取數(shù)據(jù)

調(diào)用GetRange接口讀取一個(gè)范圍內(nèi)的數(shù)據(jù)。

GetRange操作支持按照確定范圍進(jìn)行正序讀取和逆序讀取,可以設(shè)置要讀取的行數(shù)。如果范圍較大,已掃描的行數(shù)或者數(shù)據(jù)量超過(guò)一定限制,會(huì)停止掃描,并返回已獲取的行和下一個(gè)主鍵信息。您可以根據(jù)返回的下一個(gè)主鍵信息,繼續(xù)發(fā)起請(qǐng)求,獲取范圍內(nèi)剩余的行。

說(shuō)明

表格存儲(chǔ)表中的行都是按照主鍵排序的,而主鍵是由全部主鍵列按照順序組成的,所以不能理解為表格存儲(chǔ)會(huì)按照某列主鍵排序,這是常見(jiàn)的誤區(qū)。

注意事項(xiàng)

GetRange操作遵循最左匹配原則,讀取數(shù)據(jù)時(shí),依次比較第一主鍵列到第四主鍵列。例如表的主鍵包括PK1、PK2、PK3三個(gè)主鍵列,讀取數(shù)據(jù)時(shí),優(yōu)先比較PK1是否在開(kāi)始主鍵與結(jié)束主鍵的范圍內(nèi),如果PK1在設(shè)置的主鍵范圍內(nèi),則不會(huì)再比較其他的主鍵,返回在PK1主鍵范圍內(nèi)的數(shù)據(jù);如果PK1在設(shè)置的主鍵邊界上,則繼續(xù)比較PK2是否在開(kāi)始主鍵與結(jié)束主鍵的范圍內(nèi),以此類(lèi)推。關(guān)于范圍查詢(xún)?cè)淼母嘈畔ⅲ?qǐng)參見(jiàn)GetRange范圍查詢(xún)?cè)斀?/a>。

GetRange操作可能在如下情況停止執(zhí)行并返回?cái)?shù)據(jù)。

當(dāng)使用GetRange掃描的數(shù)據(jù)量較大時(shí),表格存儲(chǔ)每次請(qǐng)求僅會(huì)掃描一次(行數(shù)大于5000或者大小大于4 MB停止掃描),超過(guò)限制的數(shù)據(jù)不會(huì)繼續(xù)返回,需要通過(guò)翻頁(yè)繼續(xù)獲取后面的數(shù)據(jù)。

接口

//從表中查詢(xún)一個(gè)范圍內(nèi)的多行數(shù)據(jù)。
// @param GetRangeRequest           執(zhí)行GetRange操作所需參數(shù)的封裝。
// @return GetRangeResponse         GetRange操作的響應(yīng)內(nèi)容。
GetRange(request *GetRangeRequest) (*GetRangeResponse,error)                   

參數(shù)

參數(shù)

說(shuō)明

TableName

數(shù)據(jù)表名稱(chēng)。

Direction

讀取方向。

  • 如果值為正序(FORWARD),則起始主鍵必須小于結(jié)束主鍵,返回的行按照主鍵由小到大的順序進(jìn)行排列。

  • 如果值為逆序(BACKWARD),則起始主鍵必須大于結(jié)束主鍵,返回的行按照主鍵由大到小的順序進(jìn)行排列。

假設(shè)同一表中有兩個(gè)主鍵AB,A小于B,如果正序讀取[A, B),則按從AB的順序返回主鍵大于等于A且小于B的行數(shù)據(jù);如果逆序讀取[B, A),則按從BA的順序返回大于A且小于等于B的行數(shù)據(jù)。

StartPrimaryKey

本次范圍讀取的起始主鍵和結(jié)束主鍵,起始主鍵和結(jié)束主鍵需要是有效的主鍵或者是由INF_MININF_MAX類(lèi)型組成的虛擬點(diǎn),虛擬點(diǎn)的列數(shù)必須與主鍵相同。

其中INF_MIN表示無(wú)限小,任何類(lèi)型的值都比它大;INF_MAX表示無(wú)限大,任何類(lèi)型的值都比它小。

  • StartPrimaryKey表示起始主鍵,如果該行存在,則返回結(jié)果中一定會(huì)包含此行。

  • EndPrimaryKey表示結(jié)束主鍵,無(wú)論該行是否存在,返回結(jié)果中都不會(huì)包含此行。

數(shù)據(jù)表中的行按主鍵從小到大排序,讀取范圍是一個(gè)左閉右開(kāi)的區(qū)間,正序讀取時(shí),返回的是大于等于起始主鍵且小于結(jié)束主鍵的所有的行。

EndPrimaryKey

Limit

數(shù)據(jù)的最大返回行數(shù),此值必須大于 0。

表格存儲(chǔ)按照正序或者逆序返回指定的最大返回行數(shù)后即結(jié)束該操作的執(zhí)行,即使該區(qū)間內(nèi)仍有未返回的數(shù)據(jù)。此時(shí)可以通過(guò)返回結(jié)果中的NextStartPrimaryKey記錄本次讀取到的位置,用于下一次讀取。

ColumnsToGet

讀取的列集合,列名可以是主鍵列或?qū)傩粤小?

  • 如果不設(shè)置返回的列名,則返回整行數(shù)據(jù)。

  • 如果設(shè)置了返回的列名,當(dāng)某行中指定的列均不存在時(shí),則不返回該行,即返回值為null;當(dāng)某行中存在部分指定的列時(shí),則返回該行且只返回存在的列。

說(shuō)明
  • 查詢(xún)一行數(shù)據(jù)時(shí),默認(rèn)返回此行所有列的數(shù)據(jù)。如果需要只返回特定列,可以通過(guò)設(shè)置ColumnsToGet參數(shù)限制。如果將col0col1加入到ColumnsToGet中,則只返回col0col1列的值。

  • 如果某行數(shù)據(jù)的主鍵屬于讀取范圍,但是該行數(shù)據(jù)不包含指定返回的列,那么返回結(jié)果中不包含該行數(shù)據(jù)。

  • 當(dāng)ColumnsToGetFilter同時(shí)使用時(shí),執(zhí)行順序是先獲取ColumnsToGet指定的列,再在返回的列中進(jìn)行條件過(guò)濾。

MaxVersions

最多讀取的版本數(shù)。

重要

MaxVersionTimeRange必須至少設(shè)置一個(gè)。

  • 如果僅設(shè)置MaxVersion,則最多返回所有版本中從新到舊指定數(shù)量版本的數(shù)據(jù)。

  • 如果僅設(shè)置TimeRange,則返回該范圍內(nèi)所有數(shù)據(jù)或指定版本數(shù)據(jù)。

  • 如果同時(shí)設(shè)置MaxVersionTimeRange,則最多返回版本號(hào)范圍內(nèi)從新到舊指定數(shù)量版本的數(shù)據(jù)。

TimeRange

讀取版本號(hào)范圍或特定版本號(hào)的數(shù)據(jù)。更多信息,請(qǐng)參見(jiàn)TimeRange

重要

MaxVersionTimeRange必須至少設(shè)置一個(gè)。

  • 如果僅設(shè)置MaxVersion,則最多返回所有版本中從新到舊指定數(shù)量版本的數(shù)據(jù)。

  • 如果僅設(shè)置TimeRange,則返回該范圍內(nèi)所有數(shù)據(jù)或指定版本數(shù)據(jù)。

  • 如果同時(shí)設(shè)置MaxVersionTimeRange,則最多返回版本號(hào)范圍內(nèi)從新到舊指定數(shù)量版本的數(shù)據(jù)。

  • 如果要查詢(xún)一個(gè)范圍的數(shù)據(jù),則需要設(shè)置StartEnd。StartEnd分別表示起始時(shí)間戳和結(jié)束時(shí)間戳,范圍為前閉后開(kāi)區(qū)間,即[Start, End)

  • 如果要查詢(xún)特定版本號(hào)的數(shù)據(jù),則需要設(shè)置Specific。Specific表示特定的時(shí)間戳。

Specific[Start, End)中只需要設(shè)置一個(gè)。

時(shí)間戳的單位為毫秒,最小值為0,最大值為INT64.MAX

Filter

使用過(guò)濾器,在服務(wù)端對(duì)讀取結(jié)果再進(jìn)行一次過(guò)濾,只返回符合過(guò)濾器中條件的數(shù)據(jù)行。更多信息,請(qǐng)參見(jiàn)過(guò)濾器

說(shuō)明

當(dāng)ColumnsToGetFilter同時(shí)使用時(shí),執(zhí)行順序是先獲取ColumnsToGet指定的列,再在返回的列中進(jìn)行條件過(guò)濾。

NextStartPrimaryKey

根據(jù)返回結(jié)果中的NextStartPrimaryKey判斷數(shù)據(jù)是否全部讀取。

  • 當(dāng)返回結(jié)果中NextStartPrimaryKey不為空時(shí),可以使用此返回值作為下一次GetRange操作的起始點(diǎn)繼續(xù)讀取數(shù)據(jù)。

  • 當(dāng)返回結(jié)果中NextStartPrimaryKey為空時(shí),表示讀取范圍內(nèi)的數(shù)據(jù)全部返回。

示例

以下示例用于按照范圍讀取數(shù)據(jù)。

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)
    }
    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)
    }
    fmt.Println("continue to query rows")
}
fmt.Println("range get row finished")

詳細(xì)代碼請(qǐng)參見(jiàn)GetRange@GitHub