1.5.1 写记录

优质
小牛编辑
132浏览
2023-12-01

PutResult put(PutRequest request)

功能

添加或修改表的一条记录,可以包括全部或者部分属性,也可以指定条件,当条件成立时才写入成功

消耗一个单位写配额,如果带了条件,还消耗一个单位读配额(另外如果创建了EAGER类型的二级索引,每个Eager二级索引需要1个额外读配额)

方法参数

request : PutRequest : required

PutRequest 包括以下部分 1.tableName : String : required

指定要写哪一张表

2.record : Map< String, Datum > : required

属性名到属性值的映射,record必须包含实体组键(若存在)和主键的属性,即必须包含某行数据的key,并把该行数据写成record的值

3.condition : SimpleCondition : optional

指定写入成功的条件,即条件成立时才能写成功,是原子的check and set语义

其条件可以包括:指定该行的某一个属性大于、大于或等于、等于、小于或等于、小于某个值,或者是该行是否已存在

方法返回值

putResult : PutResult

putResult 只有success一个boolean值,表示写入成功与否

若调用超时,不能确定记录是否被写入

异常错误码

INTERNAL_ERROR(1) : 服务器异常

ACCESS_DENIED(4) : 用户对该表没有写权限

VALIDATION_FAILED(5): record没有完全包含实体组键(若存在)和主键的属性,或者指定的列不存在,或者condition中指定的列不存在

THROUGHPUT_EXCEED(8): 当前读写速度已超过该表的读写配额

RESOURCE_NOT_FOUND(9) : 所指定的表不存在

限制

record必须包含实体组键(若存在)和主键的属性

特别的,对于lazy索引,所有写入的属性集合必须包含其全部或0个索引属性,即不允许只写入其部分属性。

示例

以示例表为例,下面给出写记录的示例代码

$categories = array("work", "travel", "food");
$tableName = 'php-note';
for ($i = 0; $i < 20; $i++) {
  $version = 0; // initial version
  $insert = new PutRequest(array(
    "tableName" => $tableName,
    "record" => Array(
      "userId" => DatumUtil::datum("user1"),
      "noteId" => DatumUtil::datum($i),
      "title" => DatumUtil::datum("Title $i"),
      "content" => DatumUtil::datum("note $i"),
      "version" => DatumUtil::datum($version),
      "mtime" => DatumUtil::datum((new \DateTime())->getTimestamp()),
      "category" => DatumUtil::datum($categories[rand(0, sizeof($categories) - 1)]),
    )));
  // 普通写入
  $tableClient->put($insert);

  $put = $insert;
  $put->record["version"] = DatumUtil::datum($version + 1);
  $put->record["content"] = DatumUtil::datum("new content $i");
  $put->record["mtime"] = DatumUtil::datum((new \DateTime())->getTimestamp());
  $put->condition = new SimpleCondition(array(
    "operator" => OperatorType::EQUAL,
    "field" => "version",
    "value" => DatumUtil::datum($version)
  ));
  // 带条件的改写,当该条笔记没有没并发修改时写入成功
  $tableClient->put($put);
  echo "update note without conflict? " . $result->success . "\n";
}