2012-10-24 10 views
22

ndbのメソッドを使用してオブジェクトを作成すると、key(kind、id)タイプのキーが自動的に作成されます(idは数値)。ドキュメント全体では、キーのIDに文字列を使用できることが示されていますが、オブジェクトの作成時に自動的にこれを行う方法を見つけることができませんでした。Google App Engine NDBカスタムキーID

私はUserモデルを持っていると私はより高速な検索のための鍵のIDとして(そのユニークなので)ユーザーのユーザー名を使用することを考えていました。それはいいアイデアですか?ユーザーが投稿したので、私はユーザー名に問題がありますか(私は入力を検証しています)?

答えて

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

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

これらのIDが変更される可能性がある場合、これは悪い考えです。自分のシステムで潜在的な変化に対応することができれば良いアイデアですが、IDを使用することを決定する前にIDが一意で比較的安定していることを確認する必要があります。

+0

答えてくれてありがとう、実際には意味があります。私はそれがそれより複雑だと思った。 – andrei

+0

私はこれまでにこのアプローチで待ち時間の問題を経験しました。 DatastoreエンティティのIDを手動で設定することはお勧めできません。「ホットタブレット」の問題も発生します。データストアがエンティティIDを自動的に生成し、データをキー自体にエンコードしないようにするのが最善です。代わりに、エンティティでプロパティを使用します。 プライマリキーの自動インクリメントなど、リレーショナルデータベースの規則をDatastoreに適用することが魅力的かもしれませんが、実際にキースペースのシャドーを元に戻して問題を作成します。 [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() 
関連する問題