gpt4 book ai didi

google-app-engine - 如何处理具有两个 "unique"属性的实体?

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:38 25 4
gpt4 key购买 nike

考虑一个基于 Web 的系统,其中多个用户可能同时创建帐户。该系统要求用户具有唯一的用户名和唯一的电子邮件地址。在 RDBMS 中,这很简单:“电子邮件”字段将被标记为 UNIQUE。我如何以数据存储方式处理此问题?

这是我最初的尝试:

// Create entity using the username as key
String username = ... // provided by the user
String email = ... // provided by the user
Entity entity = new Entity("Users", KeyFactory.createKey("User", username));
entity.setProperty("email", email);

// Create a query that matches the email property
Query q = new Query();
q.setFilter(new FilterPredicate("email", FilterOperator.EQUAL, email));

// Start a transaction
Transaction txn = datastore.beginTransaction();

try {
// Try to get an entity with that username
datastore.get(KeyFactory.createKey("User", username);
}
catch(EntityNotFoundException e) {
// No entity with that username, make sure the e-mail
// is not taken either
PreparedQuery pq = datastore.prepare(q);
if (pq.countEntities(FetchOptions.Builder.withLimit(1)) == 0) {
// The e-mail isn't taken either, all good
datastore.put(entity);
txn.commit();

... handle success here ...

return;
}
}
finally {
if (txn.isActive())
txn.rollback();
}

... handle failure here ...

但经过一些简单的测试后,我注意到查询并不总是“看到”不久之前进行的“输入”(最终一致性,我应该猜到了)。为了尝试解决这个问题,我尝试将该查询转换为“虚拟”祖先查询。

所以这个“虚拟”祖先查询是这样工作的。我创建了一个带有命名键的 RootUser 类型的实体。我从这个 root 用户那里得到 key ,并使它成为上面代码中查询的祖先 key 。现在这也不起作用,我仍然收到重复的电子邮件地址。我还尝试将事务配置为跨组事务,但这也无济于事。

那么,关于如何让它工作的任何提示?有可能吗?

最佳答案

快速版本:您想使用另一个实体“种类”并将您的唯一值存储为此类对象的 ID。例如。 “用户.用户名:我的用户名”,“用户.email:email@example.com”。通过首先创建这些条目,您将知道什么时候值不是唯一的。

请参阅此示例实现.. http://webapp-improved.appspot.com/_modules/webapp2_extras/appengine/auth/models.html#Unique

关于google-app-engine - 如何处理具有两个 "unique"属性的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11335651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com