更新单行数据

更新时间:
复制 MD 格式

使用 Python SDK 新增、修改或删除单行中的属性列,并按需指定数据版本号。

前提条件

安装Tablestore Python SDK并初始化客户端。

功能说明

调用 update_row 方法按主键更新单行数据。该方法只修改指定的属性列,不影响行中的其他属性列。

def update_row(
    self,
    table_name,
    row,
    condition,
    return_type=None,
    transaction_id=None,
)

以下示例将 example_table 中主键为 ("device", 1) 的行的 status 属性列更新为 offline

primary_key = [("partition", "device"), ("id", 1)]
attribute_columns = {"PUT": [("status", "offline")]}
row = Row(primary_key, attribute_columns)
condition = Condition(RowExistenceExpectation.EXPECT_EXIST)

consumed, return_row = client.update_row(
    "example_table",
    row,
    condition,
)
print("Write CU: %s" % consumed.write)

参数说明

update_row 方法包含以下参数。

名称

类型

说明

table_name(必选)

str

数据表名称。

row(必选)

Row

待更新的主键和属性列变更。

condition(必选)

Condition

更新条件。有关配置方法,请参见条件更新。不需要判断行或列值时,设置为 Condition(RowExistenceExpectation.IGNORE)

return_type(可选)

ReturnType

返回类型。RT_NONE(默认值)表示不返回数据;RT_PK 表示返回主键列。

transaction_id(可选)

str

局部事务 ID。仅在局部事务内更新数据时设置。有关使用方法,请参见局部事务

行数据

row 的类型为 Row,包含以下参数。

名称

类型

说明

primary_key(必选)

List[Tuple]

主键信息。必须包含全部主键列,且主键列的名称、顺序、数量和类型与数据表的主键结构一致。

attribute_columns(必选)

Dict[str, List]

属性列变更。PUT 新增或修改属性列;DELETE 删除属性列的指定版本;DELETE_ALL 删除属性列的全部版本;INCREMENT 对整型属性列执行原子计数。

返回值

update_row 返回以下值。

字段

类型

说明

consumed

CapacityUnit

本次操作消耗的读写 CU。

return_row

Row

返回的行数据。return_typeRT_PK 时返回主键列,否则为 None

场景示例

写入指定版本号的属性列

PUT 操作的属性列元组中指定第三个元素,可将数据版本号设置为指定的毫秒时间戳。

timestamp = int(time.time() * 1000)
primary_key = [("partition", "device"), ("id", 1)]
attribute_columns = {
    "PUT": [("status", "online", timestamp)],
}
row = Row(primary_key, attribute_columns)

client.update_row(
    "example_table",
    row,
    Condition(RowExistenceExpectation.EXPECT_EXIST),
)

删除属性列的指定版本

以下示例删除 status 属性列中版本号为 timestamp 的数据,保留该列的其他版本。

primary_key = [("partition", "device"), ("id", 1)]
attribute_columns = {
    "DELETE": [("status", None, timestamp)],
}
row = Row(primary_key, attribute_columns)

client.update_row(
    "example_table",
    row,
    Condition(RowExistenceExpectation.EXPECT_EXIST),
)

删除整个属性列

以下示例删除 status 属性列的全部版本。

primary_key = [("partition", "device"), ("id", 1)]
attribute_columns = {"DELETE_ALL": ["status"]}
row = Row(primary_key, attribute_columns)

client.update_row(
    "example_table",
    row,
    Condition(RowExistenceExpectation.EXPECT_EXIST),
)