2012-10-24 140 views
22

當我使用ndb的方法創建對象時,會自動創建類型爲Key(kind,id)的密鑰,其中id是數字。在整個文檔中,它顯示你可以使用字符串作爲密鑰的ID,但我無法找到如何在創建對象時自動執行此操作。Google App Engine NDB自定義密鑰ID

我有一個用戶模型,我正在考慮使用用戶的用戶名(因爲它的唯一性)作爲快捷檢索的密鑰ID。這是一個好主意嗎?我用戶名有什麼問題,因爲它是用戶submited(我正在驗證輸入)?

回答

30
class UserModel(ndb.Model): 
    ... 

user_model_entity = UserModel(id='some_string', ...) 

如果這些ID可能會發生變化,這可能是一個壞主意。如果這是你自己的系統,你可以對潛在的變化做出反應,這是一個好主意,但是在決定使用它們之前,你需要確保這些ID是唯一且相對穩定的。

+0

感謝您的答案,這實際上是有道理的。我認爲它比這更復雜。 – andrei

+0

我之前遇到過這種方法的延遲問題。 手動設置數據存儲實體的ID不是一個好主意,因爲您還會遇到「熱點平板電腦」的問題。最好讓數據存儲自動生成實體ID,而不是將數據編碼到密鑰本身中。而是在實體中使用一個Property。 將關係數據庫約定應用於數據存儲區可能很誘人,例如自動遞增主鍵,但這實際上會撤銷對鍵空間的分片併產生問題。 [1] https://cloud.google.com/appengine/articles/handling_datastore_errors –

13

您可以在創建時指定實體的ID。定義模型時,不要在那裏設置id屬性。因此,例如您有:

class User(ndb.Model): 
    # fields here 

當您創建模型,您有:

user = User(id='username', ...) 

由於用戶名是獨一無二的,你確認你的輸入,那麼你將不會有任何與此問題做法。

有關ndb Model構造函數的更多信息,可以看看NDB Model Class - Constructor

希望這會有所幫助。

+1

感謝您指出NDB構造函數 – ggauravr

0

您還可以爲模型實體提供整數ID(不一定是字符串)。

class User(ndb.Model): 
... 

user = User(id=1234567890, ...) 
user.put()