使用 Python SDK 按主键范围读取连续多行数据,并按需设置读取方向、分页、数据版本和过滤条件。
前提条件
安装Tablestore Python SDK并初始化客户端。
功能说明
调用 get_range 方法按主键范围读取数据。返回范围包含起始主键,不包含结束主键。
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,
)
以下示例正向读取 example_table 中 device 分区内的所有行,仅返回每个属性列的最新版本。
start_primary_key = [("partition", "device"), ("id", INF_MIN)]
end_primary_key = [("partition", "device"), ("id", INF_MAX)]
consumed, next_start_primary_key, rows, next_token = client.get_range(
"example_table",
Direction.FORWARD,
start_primary_key,
end_primary_key,
)
for row in rows:
print(row.primary_key, row.attribute_columns)
单次范围读取最多返回 5000 行或 4 MB 数据。超出限制时,使用响应中的 next_start_primary_key 继续读取。
参数说明
get_range 方法包含以下参数。
|
名称 |
类型 |
说明 |
|
table_name(必选) |
|
数据表名称。 |
|
direction(必选) |
|
读取方向。 |
|
inclusive_start_primary_key(必选) |
|
起始主键,返回结果包含该主键。正向读取时必须小于结束主键,反向读取时必须大于结束主键。主键结构必须与数据表一致。 |
|
exclusive_end_primary_key(必选) |
|
结束主键,返回结果不包含该主键。主键结构必须与数据表一致。 |
|
columns_to_get(可选) |
|
要返回的主键列或属性列名称。不设置时返回整行。 |
|
limit(可选) |
|
单次请求最多返回的行数,必须大于 |
|
column_filter(可选) |
|
过滤条件。有关配置方法,请参见过滤器。 |
|
max_version(可选) |
|
每个属性列最多返回的版本数,默认值为 |
|
time_range(可选) |
|
数据版本范围,单位为毫秒,左闭右开。与 |
|
start_column(可选) |
|
宽行读取的起始属性列名称。 |
|
end_column(可选) |
|
宽行读取的结束属性列名称。 |
|
token(可选) |
|
宽行分页读取的起始位置。值来自上一次请求返回的 |
|
transaction_id(可选) |
|
局部事务 ID。仅在局部事务内读取数据时设置。有关使用方法,请参见局部事务。 |
返回值
get_range 返回以下值。
|
字段 |
类型 |
说明 |
|
consumed |
|
本次操作消耗的读写 CU。 |
|
next_start_primary_key |
|
下一页的起始主键。返回 |
|
rows |
|
符合条件的行数据。 |
|
next_token |
|
宽行分页读取的下一页起始位置。返回 |
场景示例
分页迭代读取
以下示例循环使用 next_start_primary_key,直到读取完指定主键范围内的所有行。
start_primary_key = [("partition", "device"), ("id", INF_MIN)]
end_primary_key = [("partition", "device"), ("id", INF_MAX)]
while start_primary_key:
consumed, start_primary_key, rows, next_token = client.get_range(
"example_table",
Direction.FORWARD,
start_primary_key,
end_primary_key,
limit=100,
)
for row in rows:
print(row.primary_key, row.attribute_columns)
反向读取
反向读取时,起始主键必须大于结束主键。
start_primary_key = [("partition", "device"), ("id", INF_MAX)]
end_primary_key = [("partition", "device"), ("id", INF_MIN)]
consumed, next_start_primary_key, rows, next_token = client.get_range(
"example_table",
Direction.BACKWARD,
start_primary_key,
end_primary_key,
)
条件过滤读取
以下示例只返回 status 属性列的最新值为 online 的行。
column_filter = SingleColumnCondition(
"status",
"online",
ComparatorType.EQUAL,
pass_if_missing=False,
)
consumed, next_start_primary_key, rows, next_token = client.get_range(
"example_table",
Direction.FORWARD,
start_primary_key,
end_primary_key,
column_filter=column_filter,
)