- ベストアンサー
GAEでエンティティからキーやIDを検索する方法
- webプログラミング(GAE/python)初心者のminowa259です。GAEでエンティティからキーやIDを検索する方法について教えてください。
- エンティティの中身はわかっているが、そのエンティティのIDやキーを検索する方法がわかりません。初めてのSQLで困惑しています。
- minowa259です。GAEでエンティティからキーやIDを検索する方法について教えてください。エンティティの中身はわかっているが、そのエンティティのIDやキーを検索する方法がわかりません。
- みんなの回答 (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をご覧ください。 ちなみに上に書いたコードのインデントは全角スペースにしているのでご注意ください。 参考になれば幸いです。
お礼
詳細な例とご回答本当に助かりました。 ありがとうございます。 サンプルの通りでうまく動きました。 本当にありがとうございました。