プロが教える店舗&オフィスのセキュリティ対策術

質問者のminowa259です。
よろしくお願い致します。

早速ですが、今回初めてwebプログラミング(GAE/python)に手を付け始めたのですが、SQL自体初めてのため非常に困惑しております。

後からエンティティを修正出来るようにしたいのですが、方法がわかりません。
キーからエンティティを取り出す方法については
http://libro.tuyano.com/index3?id=110&page=5

上記を参照し、理解出来たのですがその逆になります。
エンティティの中身はわかっていて(例えばユーザー名やメールアドレス等)、そのエンティティのIDもしくはkeyを検索するにはどのようにすれば良いのでしょうか?

よろしくお願い致します。

A 回答 (1件)

1件のエンティティを取り出して更新する場合と、複数のエンティティを取り出して更新する場合とで、やり方が少し違います。


例えば、

class Person(db.Model):
  first_name = db.StringProperty()
  last_name = db.StringProperty()
  email = db.StringProperty()

となっている場合で、email が yamada_tarou@goo.ne.jp となっている1件のエンティティを取り出したい場合は、

email = 'yamada_tarou@goo.ne.jp'
yamada_tarou = Person.all().filter('email = ', email).get()

とします。

get() で取り出したエンティティのプロパティを変更するには、次のようにします。

yamada_tarou.email = 'yamada_tarou_2@goo.ne.jp'
yamada_tarou.put()

削除する場合は put() の代わりに delete() を使います。

次に複数のエンティティを取り出して更新する場合について説明します。

first_name と last_name だけでしか filter() をかけない場合、該当するエンティティが複数あるかも知れません。
そういうことが想定される場合、get() では1件しか取り出せないため、代わりに fetch() を使います。

first_name = 'tarou'
last_name = 'yamada'
query = Person.all()
query.filter('first_name = ', first_name)
query.filter('last_name = ', last_name)
query.order('email')
list_yamada_tarou = query.fetch(100)

としてあげると、first_name が tarou で last_name が yamada のエンティティを email の値でソートして100件まで取り出し、list_yamada_tarou にリストとして格納します。

fetch() で取り出したエンティティたちのプロパティを変更する場合、エンティティひとつひとつに for 文などでアクセスできます。
for ループ内でエンティティのプロパティを変更した後、 ループを抜けてから db.put() を使ってリスト内の全エンティティをまとめて put() します。

for yamada_tarou in list_yamada_tarou:
  if yamada_tarou.email == 'yamada_tarou_2@goo.ne.jp':
    yamada_tarou.email = 'yamada_tarou@goo.ne.jp'
db.put(list_yamada_tarou)

この例だと if 文で条件に合致した1件しか変更しないので、ループ内で yamada_tarou.put() としてもいいんですが……良い例が浮かびませんでした。すみません。

なお、リスト内のエンティティをまとめて削除する場合は db.delete(list_yamada_tarou) となります。

この filter() や order() を使った取り出し方の他にGQL という、SQL に似た書き方で取り出し条件を指定する方法もありますが、SQL には慣れていらっしゃらないということでしたので、こちらの方法を紹介させていただきました。

なお、 get() や fetch() で取り出した値の ID 値や key 名を得るには次のようにします。

email = 'tarou@goo.ne.jp'
yamada_tarou = Person.all().filter('email = ', email).get()
id = yamada_tarou.id()
key_name = yamada_tarou.key().name()

もし予め ID 値や key 名がわかっている場合は、次のようにします。

id = わかっている ID 値
yamada_tarou = Person.get_by_id(id)
yamada_tarou.email = 'yamada_tarou_2@goo.ne.jp'
yamada_tarou.put()

key_name = わかっている key 名
yamada_tarou = Person.get_by_key_name(key_name)
yamada_tarou.email = 'yamada_tarou@goo.ne.jp'
yamada_tarou.put()

詳細は参照URLをご覧ください。

ちなみに上に書いたコードのインデントは全角スペースにしているのでご注意ください。

参考になれば幸いです。

参考URL:http://code.google.com/intl/ja/appengine/docs/py …
    • good
    • 0
この回答へのお礼

詳細な例とご回答本当に助かりました。
ありがとうございます。

サンプルの通りでうまく動きました。
本当にありがとうございました。

お礼日時:2011/09/08 00:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!