全部产品
表格存储

单行数据操作

更新时间:2017-06-27 10:19:30   分享:   

表格存储的 SDK 提供了 PutRow、GetRow、UpdateRow 和 DeleteRow 等单行操作的接口。

插入一行数据(PutRow)

插入数据到指定的行。

接口

  1. """
  2. 说明:写入一行数据。返回本次操作消耗的CapacityUnit。
  3. ``table_name``是对应的表名。
  4. ``row``是行数据,包括主键和属性列。
  5. ``condition``表示执行操作前做条件检查,满足条件才执行,是tablestore.metadata.Condition类的实例。目前只支持对行的存在性进行检查,检查条件包括:'IGNORE','EXPECT_EXIST'和'EXPECT_NOT_EXIST'。
  6. ``return_type``表示返回类型,是tablestore.metadata.ReturnType类的实例,目前仅支持返回PrimaryKey,一般用于主键列自增中。
  7. 返回:本次操作消耗的CapacityUnit和需要返回的行数据。
  8. ``consumed``表示消耗的CapacityUnit,是tablestore.metadata.CapacityUnit类的实例。
  9. ``return_row``表示返回的行数据,可能包括主键、属性列。
  10. """
  11. def put_row(self, table_name, row, condition = None, return_type = None)

示例

插入一行数据。

  1. ## 主键的第一个主键列是gid,值是整数1,第二个主键列是uid,值是整数101。
  2. primary_key = [('gid',1), ('uid',101)]
  3. ## 属性列包括四个:
  4. ## 第一个属性列的名字是name,值是字符串John,版本没有指定,使用系统当前时间作为版本号。
  5. ## 第二个属性列的名字是mobile,值是整数15100000000,版本没有指定,使用系统当前时间作为版本号。
  6. ## 第三个属性列的名字是address,值是二进制的China,版本没有指定,使用系统当前时间作为版本号。
  7. ## 第四个属性列的名字是age,值是29.7,版本号为1498184687。
  8. attribute_columns = [('name','John'), ('mobile',15100000000),('address', bytearray('China')),('female', False), ('age', 29.7, 1498184687000)]
  9. ## 通过primary_key和attribute_columns构造Row
  10. row = Row(primary_key, attribute_columns)
  11. # 行条件检查为:期望行不存在。如果行存在就会报错:Condition Update Failed。
  12. condition = Condition(RowExistenceExpectation.EXPECT_NOT_EXIST)
  13. try :
  14. # 调用put_row方法,如果没有指定ReturnType,则return_row为None。
  15. consumed, return_row = client.put_row(table_name, row, condition)
  16. # 打印出此次请求消耗的写CU。
  17. print ('put row succeed, consume %s write cu.' % consumed.write)
  18. # 客户端异常,一般为参数错误或者网络异常。
  19. except OTSClientError as e:
  20. print "get row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message())
  21. # 服务端异常,一般为参数错误或者流控错误。
  22. except OTSServiceError as e:
  23. 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())

提示:

  • RowExistenceExpectation.IGNORE 表示不管此行是否已经存在,都会插入新数据,如果之前有会被覆盖。

  • RowExistenceExpectation.EXPECT_EXIST 表示只有此行存在时,才会插入新数据,此时,原有数据也会被覆盖。

  • RowExistenceExpectation.EXPECT_NOT_EXIST 表示只有此行不存在时,才会插入数据,否则不执行。

  • 上述示例程序中属性列age的版本为1498184687000,这个值2017年06月23日,如果当前时间 - max_time_deviation(创建表时指定)大于1498184687000值,则PutRow的时候会被禁止。
  • 若执行成功,则不会抛异常,否则会抛异常。

  • 详细代码:PutRow@GitHub

读取一行数据(GetRow)

根据给定的主键读取单行数据。

接口

  1. """
  2. 说明:获取一行数据。
  3. ``table_name``是对应的表名。
  4. ``primary_key``是主键,类型为dict。
  5. ``columns_to_get``是可选参数,表示要获取的列的名称列表,类型为list;如果不填,表示获取所有列。
  6. ``column_filter``是可选参数,表示读取指定条件的行。
  7. ``max_version``是可选参数,表示最多读取的版本数。
  8. ``time_range``是可选参数,表示读取额版本范围或特定版本,和max_version至少存在一个。
  9. 返回:本次操作消耗的CapacityUnit、主键列和属性列。
  10. ``consumed``表示消耗的CapacityUnit,是tablestore.metadata.CapacityUnit类的实例。
  11. ``return_row``表示行数据,包括主键列和属性列,类型都为list,如:[('PK0',value0), ('PK1',value1)]。
  12. ``next_token``表示宽行读取时下一次读取的位置,编码的二进制。
  13. """
  14. def get_row(self, table_name, primary_key, columns_to_get=None,
  15. column_filter=None, max_version=None, time_range=None,
  16. start_column=None, end_column=None, token=None):

示例

读取一行数据。

  1. # 主键的第一列是uid,值是整数1,第二列是gid,值是101。
  2. primary_key = [('uid',1), ('gid',101)]
  3. # 需要返回的属性列:name,growth,type。如果columns_to_get为[],则返回所有属性列。
  4. columns_to_get = ['name', 'growth', 'type']
  5. # 增加列filter:如果growth列的值不等于0.9则返回此行。
  6. cond = CompositeColumnCondition(LogicalOperator.AND)
  7. cond.add_sub_condition(SingleColumnCondition("growth", 0.9, ComparatorType.NOT_EQUAL))
  8. cond.add_sub_condition(SingleColumnCondition("name", '杭州', ComparatorType.EQUAL))
  9. try:
  10. # 调用get_row接口查询,最后一个参数1表示只需要返回一个版本的值。
  11. consumed, return_row, next_token = client.get_row(table_name, primary_key, columns_to_get, cond, 1)
  12. print ('Read succeed, consume %s read cu.' % consumed.read)
  13. print ('Value of primary key: %s' % return_row.primary_key)
  14. print ('Value of attribute: %s' % return_row.attribute_columns)
  15. for att in return_row.attribute_columns:
  16. # 打印出每一列的key,value和version值。
  17. print ('name:%s\tvalue:%s\ttimestamp:%d' % (att[0], att[1], att[2]))
  18. # 客户端异常,一般为参数错误或者网络异常。
  19. except OTSClientError as e:
  20. print "get row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message())
  21. # 服务端异常,一般为参数错误或者流控错误。
  22. except OTSServiceError as e:
  23. 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())

提示:

  • 查询一行数据时,默认返回这一行所有列的数据。如果想只返回特定行,可以通过 columns_to_get 参数限制。如果将 col0 和 col1 加入到 columns_to_get 中,则只返回 col0 和 col1 的值。

  • 详细代码:GetRow@GitHub

更新一行数据(UpdateRow)

更新指定行的数据,如果该行不存在,则新增一行;若该行存在,则根据请求的内容在这一行中新增、修改或者删除指定列的值。

接口

  1. """
  2. 说明:更新一行数据。
  3. ``table_name``是对应的表名。
  4. ``row``表示更新的行数据,包括主键列和属性列,主键列是list;属性列是dict。
  5. ``condition``表示执行操作前做条件检查,满足条件才执行,是tablestore.metadata.Condition类的实例。
  6. 目前只支持对行的存在性进行检查,检查条件包括:'IGNORE','EXPECT_EXIST' 和 'EXPECT_NOT_EXIST'。
  7. ``return_type``表示返回类型,是tablestore.metadata.ReturnType类的实例,目前仅支持返回PrimaryKey,一般用于主键列自增中。
  8. 返回:本次操作消耗的CapacityUnit和需要返回的行数据return_row。
  9. consumed表示消耗的CapacityUnit,是tablestore.metadata.CapacityUnit类的实例。
  10. return_row表示需要返回的行数据。
  11. """
  12. def update_row(self, table_name, row, condition, return_type = None)

示例

更新一行数据。

  1. # 主键的第一列是uid,值是整数1,第二列是gid,值是101。
  2. primary_key = [('uid',1), ('gid',101)]
  3. # 更新包括PUT,DELETE和DELETE_ALL 三部分。
  4. # PUT:新增两列:第一列名字是name,值是David,第二列名字是address,值是Hongkong。
  5. # DELETE: 删除版本为1488436949003的address列的值。
  6. # DELETE_ALL:删除mobile和age两列的所有版本的值。
  7. update_of_attribute_columns = {
  8. 'PUT' : [('name','David'), ('address','Hongkong')],
  9. 'DELETE' : [('address', None, 1488436949003)],
  10. 'DELETE_ALL' : [('mobile'), ('age')],
  11. }
  12. row = Row(primary_key, update_of_attribute_columns)
  13. # 行条件为:忽略,不管行是否存在,都会更新。
  14. condition = Condition(RowExistenceExpectation.IGNORE, SingleColumnCondition("age", 20, ComparatorType.EQUAL)) # update row on\
  15. ly when this row is exist
  16. try:
  17. consumed, return_row = client.update_row(table_name, row, condition)
  18. # 客户端异常,一般为参数错误或者网络异常。
  19. except OTSClientError as e:
  20. print "update row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message())
  21. # 服务端异常,一般为参数错误或者流控错误。
  22. except OTSServiceError as e:
  23. print "update 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())

提示:

详细代码:UpdateRow@GitHub

删除一行数据(DeleteRow)

接口

  1. """
  2. 说明:删除一行数据。
  3. ``table_name``是对应的表名。
  4. ``row``表示行数据,在delete_row仅包含主键。
  5. ``condition``表示执行操作前做条件检查,满足条件才执行,是tablestore.metadata.Condition类的实例。
  6. 目前只支持对行的存在性进行检查,检查条件包括:'IGNORE','EXPECT_EXIST'和'EXPECT_NOT_EXIST'。
  7. 返回:本次操作消耗的CapacityUnit和需要返回的行数据return_row
  8. consumed表示消耗的CapacityUnit,是tablestore.metadata.CapacityUnit类的实例。
  9. return_row表示需要返回的行数据。
  10. """
  11. def delete_row(self, table_name, row, condition, return_type = None):

示例

删除一行数据。

  1. primary_key = [('gid',1), ('uid','101')]
  2. row = Row(primary_key)
  3. try:
  4. consumed, return_row = client.delete_row(table_name, row, None)
  5. # 客户端异常,一般为参数错误或者网络异常。
  6. except OTSClientError as e:
  7. print "update row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message())
  8. # 服务端异常,一般为参数错误或者流控错误。
  9. except OTSServiceError as e:
  10. print "update 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())
  11. print ('Delete succeed, consume %s write cu.' % consumed.write)

提示:

详细代码:DeleteRow@GitHub

本文导读目录
本文导读目录
以上内容是否对您有帮助?