Google app engine 密钥vs ID/名称?
我不想为我的实体创建自动生成的密钥,因此我指定自己的密钥:Google app engine 密钥vs ID/名称?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我不想为我的实体创建自动生成的密钥,因此我指定自己的密钥: Entity employee = Entity.newBuilder().setKey(makeKey("Employee", "bobby")) .addProperty(makeProperty("fname", makeValue("fname").setIndexed(false))) .addProperty(makeProperty("lname", makeValue("lname").s
Entity employee = Entity.newBuilder().setKey(makeKey("Employee", "bobby"))
.addProperty(makeProperty("fname", makeValue("fname").setIndexed(false)))
.addProperty(makeProperty("lname", makeValue("lname").setIndexed(false)))
.build();
CommitRequest request = CommitRequest.newBuilder()
.setMode(CommitRequest.Mode.NON_TRANSACTIONAL)
.setMutation(Mutation.newBuilder().addInsert(employee))
.build();
datastore.commit(request);
当我检查实体的外观时,它是这样的:
如果我指定了自己的密钥(bobby),为什么会生成自动生成的密钥?看起来bobby也是被创造出来的,但现在我有了bobby和这个自动生成的密钥。键和id/名称之间有什么区别?您使用
makeKey(“员工”、“鲍比”)创建的键是实体名为Employee
且名称为bobby
的实体的键。您在数据存储查看器中看到的关键点正是这一点的表示
一般来说,钥匙总是由
- 可选父键(具有实体类型和名称/id)
- 实体类型
- 实体名称/标识
也许这里有人可以告诉您如何将密钥解码为其组件,但请确保您所做的一切都是正确的,并且行为符合预期。这是您的密钥的url安全版本,适合在链接中使用。使用将其转换为实际键,您将看到它包含您的字符串名称。您不能指定自己的键,键实际上包含数据存储操作所需的信息。中的此说明为您提供了一个想法:
注意:URL安全字符串看起来很神秘,但没有加密!信息技术
可以轻松解码以恢复原始实体的种类和
标识符:
key = Key(urlsafe=url_string)
kind_string = key.kind()
ident = key.id()
如果您使用这样的URL安全密钥,请不要使用电子邮件等敏感数据
作为实体标识符的地址。(一种可能的解决办法是使用
敏感数据的MD5散列作为标识符。这将停止第三次
当事人,谁可以看到加密的密钥,从使用它们来收获
电子邮件地址,但这并不能阻止他们独立使用
生成他们自己的已知电子邮件地址哈希并使用它
检查数据存储中是否存在该地址。)
键的ID
部分是什么,是数字还是字符串:
密钥是一系列种类ID对。您希望确保每个实体
具有在其应用程序和命名空间中唯一的密钥。一
应用程序无需指定ID即可创建实体;这个
数据存储会自动生成数字ID。如果应用程序
“手动”选择一些ID,它们是数字的,应用程序允许
数据存储自动生成一些ID,数据存储可能会
选择应用程序已使用的一些ID。为了避免,这个
应用程序应该“保留”它将用于
选择ID(或使用字符串ID完全避免此问题)