Tablestore提供了單行讀取和範圍讀取的查詢方式用於讀取索引表中資料。當返回的屬性列在索引表中時,您可以直接讀取索引表擷取資料,否則請自行反查資料表擷取資料。
前提條件
已初始化Client。具體操作,請參見初始化OTSClient。
已建立二級索引。具體操作,請參見建立二級索引。
注意事項
索引表只能用於讀取資料。
本地二級索引表的第一列主鍵必須與資料表的第一列主鍵相同。
當需要返回的屬性列不在索引表中時,您需要自行反查資料表來擷取資料。
單行讀取資料
調用GetRow介面讀取一行資料。更多資訊,請參見讀取單行資料。
參數
使用GetRow介面讀取索引表中資料時有如下注意事項:
table_name需要設定為索引表名稱。
由於系統會自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中,所以設定行的主鍵時,需要同時設定索引表索引列和補齊的資料表主鍵。
樣本
以下樣本用於讀取索引表中指定主鍵的行資料。
# 構造主鍵。第一列主鍵為definedcol1,值是整數1;第二列主鍵為pk1,值是整數101;第三列主鍵為補齊的資料表主鍵pk2,值是整數11。
# 如果讀取本地二級索引中的資料,索引表的第一列主鍵必須與資料表的第一列主鍵相同。
primary_key = [('definedcol1', 1), ('pk1', 101), ('pk2', 11)]
# 需要返回的索引表屬性列definedcol2和definedcol3。如果columns_to_get為[],則返回索引表的所有屬性列。
columns_to_get = ['definedcol2', 'definedcol3']
# 設定過濾器,增加列條件。過濾條件為definedcol2列值不等於1且definedcol3列值等於'test'。
cond = CompositeColumnCondition(LogicalOperator.AND)
cond.add_sub_condition(SingleColumnCondition("definedcol2", 1, ComparatorType.NOT_EQUAL))
cond.add_sub_condition(SingleColumnCondition("definedcol3", 'test', ComparatorType.EQUAL))
try:
# 調用get_row介面查詢資料。
# 配置索引表名稱,最後一個參數值1表示只需要返回一個版本的值。
consumed, return_row, next_token = client.get_row('<INDEX_NAME>', primary_key, columns_to_get, cond, 1)
print('Read succeed, consume %s read cu.' % consumed.read)
print('Value of primary key: %s' % return_row.primary_key)
print('Value of attribute: %s' % return_row.attribute_columns)
for att in return_row.attribute_columns:
# 列印每一列的key、value和version值。
print('name:%s\tvalue:%s' % (att[0], att[1]))
# 用戶端異常,一般為參數錯誤或者網路異常。
except OTSClientError as e:
print('get row failed, http_status:%d, error_message:%s' % (e.get_http_status(), e.get_error_message()))
# 服務端異常,一般為參數錯誤或者流控錯誤。
except OTSServiceError as e:
print('get row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s' % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id()))
範圍讀取資料
調用GetRange介面讀取一個範圍內的資料。更多資訊,請參見範圍讀取資料。
參數
使用GetRange介面讀取索引表中資料時有如下注意事項:
table_name需要設定為索引表名稱。
由於系統會自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中,所以設定起始主鍵和結束主鍵時,需要同時設定索引表索引列和補齊的資料表主鍵。
樣本
以下樣本用於讀取指定主鍵範圍內的資料。
# 設定範圍讀的起始主鍵。如果讀取本地二級索引中的資料,索引表的第一列主鍵必須與資料表的第一列主鍵相同。
inclusive_start_primary_key = [('definedcol1', 1), ('pk1', INF_MIN), ('pk2', INF_MIN)]
# 設定範圍讀的結束主鍵。
exclusive_end_primary_key = [('definedcol1', 5), ('pk1', INF_MAX), ('pk2', INF_MIN)]
# 查詢索引表中所有列。
columns_to_get = []
# 每次最多返回90行,如果總共有100個結果,首次查詢時指定limit=90,則第一次最多返回90,最少可能返回0個結果,但是next_start_primary_key不為None。
limit = 90
# 設定過濾器,增加列條件。過濾條件為definedcol2列值小於50且definedcol3列值等於'China'。
cond = CompositeColumnCondition(LogicalOperator.AND)
# 如果某行不存在對應列時,您需要配置pass_if_missing參數來確定該行是否滿足過濾條件。
# 當不設定pass_if_missing或者設定pass_if_missing為True時,表示當某行不存在該列時,該行滿足過濾條件。
# 當設定pass_if_missing為False時,表示當某行不存在該列時,該行不滿足過濾條件。
cond.add_sub_condition(SingleColumnCondition("definedcol3", 'China', ComparatorType.EQUAL, pass_if_missing=False))
cond.add_sub_condition(SingleColumnCondition("definedcol2", 50, ComparatorType.LESS_THAN, pass_if_missing=False))
try:
# 調用get_range介面。
# 設定索引表名稱。
consumed, next_start_primary_key, row_list, next_token = client.get_range(
'<INDEX_NAME>', Direction.FORWARD,
inclusive_start_primary_key, exclusive_end_primary_key,
columns_to_get,
limit,
column_filter=cond,
max_version=1,
time_range=(1557125059000, 1557129059000) # start_time大於等於1557125059000,end_time小於1557129059000。
)
all_rows = []
all_rows.extend(row_list)
# 當next_start_primary_key不為空白時,則繼續讀取資料。
while next_start_primary_key is not None:
inclusive_start_primary_key = next_start_primary_key
consumed, next_start_primary_key, row_list, next_token = client.get_range(
'<INDEX_NAME>', Direction.FORWARD,
inclusive_start_primary_key, exclusive_end_primary_key,
columns_to_get, limit,
column_filter=cond,
max_version=1
)
all_rows.extend(row_list)
# 列印主鍵和屬性列。
for row in all_rows:
print(row.primary_key, row.attribute_columns)
print('Total rows: ', len(all_rows))
# 用戶端異常,一般為參數錯誤或者網路異常。
except OTSClientError as e:
print('get row failed, http_status:%d, error_message:%s' % (e.get_http_status(), e.get_error_message()))
# 服務端異常,一般為參數錯誤或者流控錯誤。
except OTSServiceError as e:
print('get row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s' % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id())