捕获异常:关键路径元素名称“”__xyz__”;无效


Caught exception: The key path element name "__xyz__" is invalid

使用PHP-GDS库,当密钥的格式为"__xyz__"时,我在尝试"upstart"实体时收到异常。

有没有办法解决这个问题,因为密钥是一个我可能无法控制的用户名,而__xyz__是一个完全有效的用户名。这是代码和异常消息:

$username  =  "__xyz__";
$obj_user = new Entity();
$obj_user->setKeyName($username);
try {
  $result = $obj_user_store->upsert($obj_user);
}catch (Exception $e) {
   echo 'Caught exception: ',  $e->getMessage(), "'n";
   return false;
}

例外:

Caught exception: The key path element name "__xyz__" is reserved.

不幸的是,没有,您必须以某种方式对用户名进行编码。或者,我建议使用自动生成的密钥,并将用户提供的数据存储在值中,而不是密钥中。

对于这种情况,文档非常糟糕,在被取代的Python API数据存储的文档中只提到了一点:https://cloud.google.com/appengine/docs/python/datastore/entities:"密钥名称不能以两个下划线__*__开头和结尾"。Java文档对此只字不提。也不是现代Python API。而且我找不到任何用于数据存储的PHP文档。

但所有API都是一样的,因为异常发生在数据库端,所以使用哪种语言并不重要(下面都是protobuf)。

我只知道双下划线的一个用法:当你构建一个查询,并希望按键升序/降序排序时。您可以通过按名为__key__的不存在的保留密钥进行排序来完成此操作。