使用PHP-GDS库时,我在尝试“upsert”时遇到异常。当密钥格式为" __ xyz __"。
时的实体有没有办法解决这个问题,因为密钥是我可能无法控制的用户名,而__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.
答案 0 :(得分:1)
不幸的是,你必须以某种方式对用户名进行编码。或者,我建议使用自动生成的密钥,并将用户提供的数据存储在值中,而不是密钥。
对于这种情况,文档非常糟糕,只有一个提及,在用于数据存储的取代Python API的文档中:https://cloud.google.com/appengine/docs/python/datastore/entities:“键名不能以两个下划线__*__
开头和结尾”。
Java文档没有说明这一点。也不是现代的Python API。我找不到数据存储的任何PHP文档。
但是对于所有API来说都是一样的,因为异常发生在db-side上,所以你使用哪种语言并不重要(这是所有的protobufs)。
我只知道双下划线的一种用法:当您构建查询时,并希望按键对升序/降序进行排序。您可以通过按名为__key__
的不存在的保留键进行排序来完成此操作。