「Google App Engine データストアの利用」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「==Google App Engine データストアの利用== [Python][Google App Engine][GQL] ===概要=== =====概要===== *http://code.google.com/intl/ja/appengine/docs/pyth…」) |
|||
(同じ利用者による、間の3版が非表示) | |||
1行目: | 1行目: | ||
− | ==Google App Engine データストアの利用== | + | ==[[Google App Engine データストアの利用]]== |
− | [Python][Google App Engine][GQL] | + | [[Python]] | [[Google App Engine]] | [[GQL]] | |
===概要=== | ===概要=== | ||
9行目: | 9行目: | ||
=====参考===== | =====参考===== | ||
*http://typea.info/blg/glob/2008/09/google_app_engine_13.html | *http://typea.info/blg/glob/2008/09/google_app_engine_13.html | ||
− | * App Engine | + | * App Engine は、[[Python]] 用の データ モデリング API を備えている |
− | * Django のデータ モデリング API と似ているが、App Engine の拡張可能なデータストを背後で使用 | + | * [[Django]] のデータ モデリング API と似ているが、App Engine の拡張可能なデータストを背後で使用 |
===利用上の注意=== | ===利用上の注意=== | ||
====[http://code.google.com/intl/ja/appengine/docs/python/datastore/typesandpropertyclasses.html 検索条件と並べ替えに一部プロパティが使用できない]==== | ====[http://code.google.com/intl/ja/appengine/docs/python/datastore/typesandpropertyclasses.html 検索条件と並べ替えに一部プロパティが使用できない]==== | ||
− | + | <blockquote>並べ替えやフィルタに使用するには、プロパティを、インデックス化する必要があるが、一部のプロパティは、インデックス化できないため、検索条件や並べ替えに使用できないないので注意が必要!</blockquote> | |
*Blob | *Blob | ||
*Text | *Text | ||
20行目: | 20行目: | ||
====[http://code.google.com/intl/ja/appengine/docs/python/datastore/gqlreference.html GQL で検索条件にリテラルを使用する]==== | ====[http://code.google.com/intl/ja/appengine/docs/python/datastore/gqlreference.html GQL で検索条件にリテラルを使用する]==== | ||
− | + | <blockquote>GQL でリテラルを使用する場合には注意が必要。日付型などの場合DATE(リテラル)とする必要がある。</blockquote> | |
{|class="wikitable" | {|class="wikitable" | ||
33行目: | 33行目: | ||
|- | |- | ||
|Boolean リテラル | |Boolean リテラル | ||
− | | | + | |T[[R]]UE または FALSE |
|- | |- | ||
|日時リテラル | |日時リテラル | ||
60行目: | 60行目: | ||
|- | |- | ||
|User オブジェクト | |User オブジェクト | ||
− | | | + | |USE[[R]](email-address) |
|- | |- | ||
|GeoPt | |GeoPt | ||
80行目: | 80行目: | ||
from google.appengine.ext import db | from google.appengine.ext import db | ||
− | class LoadHogeEntity(webapp. | + | class LoadHogeEntity(webapp.[[R]]equestHandler): |
def get(self): | def get(self): | ||
context = {} | context = {} | ||
88行目: | 88行目: | ||
return self.response.out.write(template.render('templates/hoge.html', context)) | return self.response.out.write(template.render('templates/hoge.html', context)) | ||
− | class DeleteHogeEntity(webapp. | + | class DeleteHogeEntity(webapp.[[R]]equestHandler): |
def get(self): | def get(self): | ||
key_str = self.request.get('key_str') | key_str = self.request.get('key_str') | ||
key = db.Key(key_str) # (2) | key = db.Key(key_str) # (2) | ||
− | q = HogeEntity.gql(" | + | q = HogeEntity.gql("WHE[[R]]E __key__ =:1", key) # (3) |
hoge = q.fetch(1) | hoge = q.fetch(1) | ||
104行目: | 104行目: | ||
* 新しいオブジェクトをデータストアに保存(3) | * 新しいオブジェクトをデータストアに保存(3) | ||
* 保存されたオブジェクトをGQLで取り出す(4) | * 保存されたオブジェクトをGQLで取り出す(4) | ||
− | * クラスのgqlメソッドでもデータを取得できる。(SELECT * | + | * クラスのgqlメソッドでもデータを取得できる。(SELECT * F[[R]]OM Person を省略できる |
− | **persons = Person.gql(" | + | **persons = Person.gql("O[[R]]DE[[R]] BY id LIMIT 10") |
− | * | + | *WHE[[R]]E句に定数は指定できない。パラメータを位置、名前で指定できる。 |
− | ** persons = Person.gql(" | + | ** persons = Person.gql("WHE[[R]]E id = :1 O[[R]]DE[[R]] BY id", int("1")) |
− | ** persons = Person.gql(" | + | ** persons = Person.gql("WHE[[R]]E id = :id O[[R]]DE[[R]] BY id", id=int("2")) |
124行目: | 124行目: | ||
mail = db.EmailProperty() | mail = db.EmailProperty() | ||
− | class MainPage(webapp. | + | class MainPage(webapp.[[R]]equestHandler): |
def get(self): | def get(self): | ||
− | self.response.out.write(' | + | self.response.out.write('<html><body>') |
# (4) 保存されたデータを GQL で取り出す | # (4) 保存されたデータを GQL で取り出す | ||
− | # persons = Person.gql(" | + | # persons = Person.gql("O[[R]]DE[[R]] BY id LIMIT 10") |
− | # persons = Person.gql(" | + | # persons = Person.gql("WHE[[R]]E id = :1 O[[R]]DE[[R]] BY id", int("1")) |
− | # persons = Person.gql(" | + | # persons = Person.gql("WHE[[R]]E id = :id O[[R]]DE[[R]] BY id", id=int("2")) |
− | persons = db.GqlQuery("SELECT * | + | persons = db.GqlQuery("SELECT * F[[R]]OM Person O[[R]]DE[[R]] BY id LIMIT 10") |
− | self.response.out.write(" | + | self.response.out.write("<form action='/add' method='post'>") |
− | self.response.out.write(""" | + | self.response.out.write("""<table border='1'> |
− | + | <tr> | |
− | + | <th>id</th><th>name</th><th>mail</th> | |
− | + | </tr> | |
""") | """) | ||
for person in persons: | for person in persons: | ||
− | self.response.out.write(" | + | self.response.out.write("<tr>") |
− | self.response.out.write(" | + | self.response.out.write("<td>%d</td>" %person.id) |
− | self.response.out.write(" | + | self.response.out.write("<td>%s</td>" %cgi.escape(person.name)) |
− | self.response.out.write(" | + | self.response.out.write("<td>%s</td>" %cgi.escape(person.mail)) |
− | self.response.out.write(" | + | self.response.out.write("</tr>") |
self.response.out.write(""" | self.response.out.write(""" | ||
− | + | <tr> | |
− | + | <td><input type='text' size='2' name='id'></td> | |
− | + | <td><input type='text' size='10' name='name'></td> | |
− | + | <td><input type='text' size='15' name='mail'> | |
− | + | <input type='submit' value='add'></td> | |
− | + | </tr> | |
− | + | </table> | |
""") | """) | ||
− | self.response.out.write(" | + | self.response.out.write("</form>") |
− | self.response.out.write(' | + | self.response.out.write('</body></html>') |
# データ投入処理 | # データ投入処理 | ||
− | class AddPersonPage(webapp. | + | class AddPersonPage(webapp.[[R]]equestHandler): |
def post(self): | def post(self): | ||
person = Person() | person = Person() |
2020年2月16日 (日) 04:26時点における最新版
目次
Google App Engine データストアの利用
Python | Google App Engine | GQL |
概要
概要
リファレンス
参考
- http://typea.info/blg/glob/2008/09/google_app_engine_13.html
- App Engine は、Python 用の データ モデリング API を備えている
- Django のデータ モデリング API と似ているが、App Engine の拡張可能なデータストを背後で使用
利用上の注意
検索条件と並べ替えに一部プロパティが使用できない
<blockquote>並べ替えやフィルタに使用するには、プロパティを、インデックス化する必要があるが、一部のプロパティは、インデックス化できないため、検索条件や並べ替えに使用できないないので注意が必要!</blockquote>
- Blob
- Text
- TextProperty
GQL で検索条件にリテラルを使用する
<blockquote>GQL でリテラルを使用する場合には注意が必要。日付型などの場合DATE(リテラル)とする必要がある。</blockquote>
リテラル | 用法 |
---|---|
str リテラル | (一重引用符で囲まれた文字列)文字列内の一重引用符は としてエスケープされます。例: 'Joes Diner' |
整数または浮動小数点数リテラル | 例: 42.7 |
Boolean リテラル | TRUE または FALSE |
日時リテラル | DATETIME(year, month, day, hour, minute, second) |
日時リテラル | DATETIME('YYYY-MM-DD HH:MM:SS') |
日付リテラル | DATE(year, month, day) |
日付リテラル | DATE('YYYY-MM-DD') |
時刻リテラル | TIME(hour, minute, second) |
時刻リテラル | TIME('HH:MM:SS') |
エンティティ キー | KEY('encoded key') |
エンティティ キー | KEY(kind, name/ID [, kind, name/ID...]) |
User オブジェクト | USER(email-address) |
GeoPt | (浮動小数点数値の緯度と経度付き)GEOPT(lat, long) |
バウンド パラメータ | 位置パラメータが数値によって参照されます。title = :1 |
キーワードパラメータ | 名前によって参照されます。title = :mytitle |
クエリで自動生成される key を使用する
- (1) key を文字列に変換
- (2) 文字列に変換された key を Key オブジェクトに変換
- (3) GQL で、__key__ と比較する
from google.appengine.ext import db class LoadHogeEntity(webapp.RequestHandler): def get(self): context = {} results = HogeEntity.all() for result in results: context['key_str'] = str(result.key()) # (1) return self.response.out.write(template.render('templates/hoge.html', context)) class DeleteHogeEntity(webapp.RequestHandler): def get(self): key_str = self.request.get('key_str') key = db.Key(key_str) # (2) q = HogeEntity.gql("WHERE __key__ =:1", key) # (3) hoge = q.fetch(1) if hoge: hoge.delete()
例
手順
- import 文を最初の行に追加(1)
- プロパティの種別はデータストアAPIリファレンス参照(2)
- 新しいオブジェクトをデータストアに保存(3)
- 保存されたオブジェクトをGQLで取り出す(4)
- クラスのgqlメソッドでもデータを取得できる。(SELECT * FROM Person を省略できる
- WHERE句に定数は指定できない。パラメータを位置、名前で指定できる。
import cgi import wsgiref.handlers from google.appengine.api import users from google.appengine.ext import webapp from google.appengine.ext import db #(1) # 保存するモデルクラス class Person(db.Model): id = db.IntegerProperty() #(2) name = db.StringProperty() mail = db.EmailProperty() class MainPage(webapp.RequestHandler): def get(self): self.response.out.write('<html><body>') # (4) 保存されたデータを GQL で取り出す # persons = Person.gql("ORDER BY id LIMIT 10") # persons = Person.gql("WHERE id = :1 ORDER BY id", int("1")) # persons = Person.gql("WHERE id = :id ORDER BY id", id=int("2")) persons = db.GqlQuery("SELECT * FROM Person ORDER BY id LIMIT 10") self.response.out.write("<form action='/add' method='post'>") self.response.out.write("""<table border='1'> <tr> <th>id</th><th>name</th><th>mail</th> </tr> """) for person in persons: self.response.out.write("<tr>") self.response.out.write("<td>%d</td>" %person.id) self.response.out.write("<td>%s</td>" %cgi.escape(person.name)) self.response.out.write("<td>%s</td>" %cgi.escape(person.mail)) self.response.out.write("</tr>") self.response.out.write(""" <tr> <td><input type='text' size='2' name='id'></td> <td><input type='text' size='10' name='name'></td> <td><input type='text' size='15' name='mail'> <input type='submit' value='add'></td> </tr> </table> """) self.response.out.write("</form>") self.response.out.write('</body></html>') # データ投入処理 class AddPersonPage(webapp.RequestHandler): def post(self): person = Person() id = self.request.get('id') if id != : person.id = int(id) person.name = self.request.get('name') person.mail = self.request.get('mail') person.put() # (3)データ保存 self.redirect('/') def main(): application = webapp.WSGIApplication( [('/', MainPage), ('/add', AddPersonPage)], debug=True ) wsgiref.handlers.CGIHandler().run(application) if __name__ == "__main__": main()
© 2006 矢木浩人