- App Engine は、Python 用の データ モデリング API を備えている
- Django のデータ モデリング API と似ているが、App Engine の拡張可能なデータストを背後で使用
import
文を最初の行に追加(1)
- プロパティの種別はデータストアAPIリファレンス参照(2)
- 新しいオブジェクトをデータストアに保存(3)
- 保存されたオブジェクトをGQLで取り出す(4)
- クラスのgqlメソッドでもデータを取得できる。(SELECT * FROM Person を省略できる
- persons = Person.gql("ORDER BY id LIMIT 10")
- WHERE句に定数は指定できない。パラメータを位置、名前で指定できる。
- persons = Person.gql("WHERE id = :1 ORDER BY id", int("1"))
- persons = Person.gql("WHERE id = :id ORDER BY id", id=int("2"))
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 = 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()