Tablestore提供了單行讀取和範圍讀取的查詢方式用於讀取索引表中資料。當返回的屬性列在索引表中時,您可以直接讀取索引表擷取資料,否則請自行反查資料表擷取資料。
前提條件
已初始化Client。具體操作,請參見初始化OTSClient。
已建立二級索引。具體操作,請參見建立二級索引。
注意事項
索引表只能用於讀取資料。
本地二級索引表的第一列主鍵必須與資料表的第一列主鍵相同。
當需要返回的屬性列不在索引表中時,您需要自行反查資料表來擷取資料。
單行讀取資料
調用GetRow介面讀取一行資料。更多資訊,請參見讀取單行資料。
參數
使用GetRow介面讀取索引表中資料時有如下注意事項:
TableName需要設定為索引表名稱。
由於系統會自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中,所以設定行的主鍵時,需要同時設定索引表索引列和補齊的資料表主鍵。
樣本
以下樣本用於讀取索引表中指定主鍵的行資料。
func GetRowFromIndex(client *tablestore.TableStoreClient, indexName string) {
getRowRequest := new(tablestore.GetRowRequest)
criteria := new(tablestore.SingleRowQueryCriteria);
//構造主鍵。如果讀取本地二級索引中的資料,索引表的第一列主鍵必須與資料表的第一列主鍵相同。
putPk := new(tablestore.PrimaryKey)
putPk.AddPrimaryKeyColumn("definedcol1", "value1")
putPk.AddPrimaryKeyColumn("pk1", int64(2))
putPk.AddPrimaryKeyColumn("pk2", []byte("pk2"))
criteria.PrimaryKey = putPk
getRowRequest.SingleRowQueryCriteria = criteria
getRowRequest.SingleRowQueryCriteria.TableName = indexName
getRowRequest.SingleRowQueryCriteria.MaxVersion = 1
getResp, err := client.GetRow(getRowRequest)
if err != nil {
fmt.Println("getrow failed with error:", err)
} else {
fmt.Println("get row", getResp.Columns[0].ColumnName,"result is ", getResp.Columns[0].Value,)
}
}
範圍讀取資料
調用GetRange介面讀取一個範圍內的資料。更多資訊,請參見範圍讀取資料。
參數
使用GetRange介面讀取索引表中資料時有如下注意事項:
TableName需要設定為索引表名稱。
由於系統會自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中,所以設定起始主鍵和結束主鍵時,需要同時設定索引表索引列和補齊的資料表主鍵。
樣本
使用全域二級索引
以下樣本用於讀取全域二級索引表中指定主鍵範圍內的資料。其中第一列主鍵definedcol1列值為value1。
func GetRangeFromGlobalIndex(client *tablestore.TableStoreClient, indexName string) {
getRangeRequest := &tablestore.GetRangeRequest{}
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = indexName
//構造起始主鍵。主鍵範圍為左閉右開的區間。
startPK := new(tablestore.PrimaryKey)
//索引表的第一主鍵列。
startPK.AddPrimaryKeyColumn("definedcol1", "value1")
//索引表的第二主鍵列,此主鍵列為自動補齊的資料表主鍵列。
startPK.AddPrimaryKeyColumnWithMinValue("pk1")
//索引表的第三主鍵列,此主鍵列為自動補齊的資料表主鍵列。
startPK.AddPrimaryKeyColumnWithMinValue("pk2")
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumn("definedcol1", "value1")
endPK.AddPrimaryKeyColumnWithMaxValue("pk1")
endPK.AddPrimaryKeyColumnWithMaxValue("pk2")
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("getrow finished")
}
使用本地二級索引
以下樣本用於讀取本地二級索引表中的所有行資料。
func GetRangeFromLocalIndex(client *tablestore.TableStoreClient, indexName string) {
getRangeRequest := &tablestore.GetRangeRequest{}
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = indexName
//構造起始主鍵。主鍵範圍為左閉右開的區間。
startPK := new(tablestore.PrimaryKey)
//索引表的第一主鍵列。
startPK.AddPrimaryKeyColumnWithMinValue("pk1")
//索引表的第二主鍵列。
startPK.AddPrimaryKeyColumnWithMinValue("definedcol1")
//索引表的第三主鍵列,此主鍵列為自動補齊的資料表主鍵列。
startPK.AddPrimaryKeyColumnWithMinValue("pk2")
//構造結束主鍵。
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumnWithMaxValue("pk1")
endPK.AddPrimaryKeyColumnWithMaxValue("definedcol1")
endPK.AddPrimaryKeyColumnWithMaxValue("pk2")
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)
//如果需要返回索引表的屬性列,請參照如下樣本編寫代碼。
//fmt.Println("get row", row.Columns[0].ColumnName, "result is ", row.Columns[0].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("getrow finished")
}