Google App Engineにおけるkeyに関して
2010/04/25 12:59:18
Google App Engineでデータストアについて色々な記事を探していると、「keyによるget()はとても早い」と書かれている記事をよく目にする。
最初はどのことをさすのだろうかと確証がなかったのだが、つまりはこう。
「Person」は任意のデータストアクラス名とします。
これがいちエンティティを取得する時、最速であるというわけ。
知っていないとややこしいことが2点。
1.なぜ「db.get()」という特定モデルを指定しないで取得できるのか
答えは「key」がデータストア全体における一意の値だから、わざわざ特定のモデルクラス名を指定する必要がない。
2.「key」を「db.Key(key)」とせずに「db.get(key)」としてもエンティティを取得出来てしまう。
試しに「type()」で型を調べてみると、
「key」→「type 'str'」
「db.Key(key)」→「class 'google.appengine.api.datastore_types.Key'」
となるので両者は明らかに違うことは確か。
でもどちらをgetにつっこんでもエンティティを取得できる。
なぜかは今後も調べる必要があるが、「db.get(db.Key(key))」が正しい形のようだ。
マニュアルによると「get」関数には「keyオブジェクト」または「keyオブジェクトのリスト」を渡すと書かれている以上、文字列を渡した場合はエラーになるような気がするのだが…
「Person」は任意のデータストアクラス名とします。
key = self.request.get('key')
person = db.get(db.Key(key))これはkey = self.request.get('key')
person = Person.get(db.Key(key))とも書ける。これがいちエンティティを取得する時、最速であるというわけ。
知っていないとややこしいことが2点。
1.なぜ「db.get()」という特定モデルを指定しないで取得できるのか
答えは「key」がデータストア全体における一意の値だから、わざわざ特定のモデルクラス名を指定する必要がない。
2.「key」を「db.Key(key)」とせずに「db.get(key)」としてもエンティティを取得出来てしまう。
試しに「type()」で型を調べてみると、
「key」→「type 'str'」
「db.Key(key)」→「class 'google.appengine.api.datastore_types.Key'」
となるので両者は明らかに違うことは確か。
でもどちらをgetにつっこんでもエンティティを取得できる。
なぜかは今後も調べる必要があるが、「db.get(db.Key(key))」が正しい形のようだ。
マニュアルによると「get」関数には「keyオブジェクト」または「keyオブジェクトのリスト」を渡すと書かれている以上、文字列を渡した場合はエラーになるような気がするのだが…