全部產品
Search
文件中心

Tablestore:範圍讀取資料

更新時間:Mar 31, 2026

本文介紹如何通過 Python SDK 範圍讀取Table Store中的資料。

前提條件

初始化Tablestore Client

方法說明

def get_range(self, table_name, direction,
              inclusive_start_primary_key,
              exclusive_end_primary_key,
              columns_to_get=None,
              limit=None,
              column_filter=None,
              max_version=1,
              time_range=None,
              start_column=None,
              end_column=None,
              token=None,
              transaction_id=None):

參數說明

名稱

類型

說明

table_name(必選)

str

資料表名稱。

inclusive_start_primary_key(必選)

List[Tuple]

起始主鍵資訊,包括主鍵列名稱和主索引值。

  • 返回資料包含起始主鍵。

  • 主鍵個數和類型必須與資料表的主鍵保持一致。

  • 正向讀取資料時,起始主鍵必須小於結束主鍵。

  • 反向讀取資料時,起始主鍵必須大於結束主鍵。

  • INF_MIN 表示無限小,INF_MAX 表示無限大。

exclusive_end_primary_key(必選)

List[Tuple]

結束主鍵資訊,包括主鍵列名稱和主索引值。

  • 返回資料不包含結束主鍵。

  • 主鍵個數和類型必須與資料表的主鍵保持一致。

  • INF_MIN 表示無限小,INF_MAX 表示無限大。

direction(必選)

Direction

讀取方向。

  • FORWARD:預設值,正向讀取資料。

  • BACKWARD:反向讀取資料。

max_version(可選)

int

最大版本數,預設值為1。

  • 必須設定最大版本數和版本範圍的其中一個。

  • 如果符合查詢條件的資料版本數量超過設定的最大版本數,按從新到舊的順序返回指定版本數量的資料。

time_range(可選)

Tuple

資料版本範圍。

  • 必須設定最大版本數和版本範圍的其中一個。

  • Table Store資料表的每個屬性列可以有不同的資料版本,設定版本範圍後,僅返回版本範圍內的資料。

limit(可選)

int

單次返回最大行數,必須大於 0。如果符合查詢條件的資料行數大於設定的值,將返回指定的最大行數和用於下一次查詢的起始主索引值。

columns_to_get(可選)

List[str]

指定讀取的資料列,可以是主鍵列或屬性列。

  • 不設定columns_to_get時,返回整行資料。

  • 設定columns_to_get時,如果讀取的行資料不包含任何指定的資料列,將返回 null。

column_filter(可選)

ColumnCondition

過濾條件,詳情請參見過濾器

  • 如果同時設定columns_to_get和column_filter,先按columns_to_get篩選合格資料行,再按column_filter條件過濾資料。

transaction_id(可選)

str

局部事務ID,用於唯一標識局部事務,詳情請參見局部事務

範例程式碼

以下範例程式碼用於讀取 test_table 表中主索引值大於 row1 的資料。

try:
    # 設定查詢起始主鍵
    inclusive_start_primary_key = [('id', 'row1')]
    # 設定查詢結束主鍵(返回結果不包含結束主鍵)
    exclusive_end_primary_key = [('id', INF_MAX)]

    # 調用 get_range 方法查詢資料
    consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
                                                                              inclusive_start_primary_key, exclusive_end_primary_key)

    # 返回結果處理
    print('* Read CU Cost: %s' % consumed.read)
    print('* Write CU Cost: %s' % consumed.write)
    print('* Rows Data:')
    for row in row_list:
        print(row.primary_key, row.attribute_columns)
except Exception as e:
    print("Range get failed with error: %s" % e)

單次範圍掃描資料上限為 5000 行或者 4 MB,超出限制部分的資料將返回用於下一次讀取的起始主索引值,您可以參考以下代碼進行迭代查詢。

while True:
    # 調用 get_range 方法查詢資料
    consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
                                                                              inclusive_start_primary_key,
                                                                              exclusive_end_primary_key)

    # 返回結果處理
    print('* Read CU Cost: %s' % consumed.read)
    print('* Write CU Cost: %s' % consumed.write)
    print('* Rows Count: %s' % len(row_list))
    print('* Rows Data:')
    for row in row_list:
        print(row.primary_key, row.attribute_columns)

    # 設定下一次讀取資料起始主鍵
    if next_start_primary_key:
        inclusive_start_primary_key = next_start_primary_key
    else:
        break

您也可以在查詢資料時參考範例程式碼進行以下設定。

  • 設定讀取的資料版本範圍,結果只返回版本範圍內的資料。

    # 設定查詢的資料版本範圍為目前時間往前一天
    time_range = (int(time.time() * 1000 - 86400 * 1000), int(time.time() * 1000))
    
    consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
                                                                              inclusive_start_primary_key, exclusive_end_primary_key,
                                                                              time_range= time_range)
  • 指定讀取的屬性列。

    columns_to_get = ['col1']
    
    # 調用 get_range 方法查詢資料
    consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
                                                                              inclusive_start_primary_key, exclusive_end_primary_key,
                                                                              columns_to_get)
  • 設定單次返回最大行數。

    limit = 10
    
    # 調用 get_range 方法查詢資料
    consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
                                                                              inclusive_start_primary_key, exclusive_end_primary_key,
                                                                              limit=limit)

相關文檔

批量讀取資料