Google App Engine PythonのDatastore APIを使用する

アプリケーションの公開やテンプレートの使い方など、徐々にわかってきたので、
今度はDatastore APIの使い方を調べてみます。

参考になるのは、Googleさんの標準ドキュメント。

Google App Engine データの作成、取得、削除
http://code.google.com/intl/ja/appengine/docs/python/datastore/creatinggettinganddeletingdata.html



データ登録用のオブジェクトを作成



イメージ的には、オブジェクト指向データベースという感じでしょうか?
※使ったことないですが。

登録したいデータをオブジェクトで表現します。
触った感じだと、CouchDBに近いかも。

サンプルとして、郵便番号と住所を保存することを考えて見ます。
・・・いつもと同じで申し訳ないです。


郵便番号と住所の二つの文字列フィールドを持てばよいので、
モデルはこんな感じになります。


#データベース登録用のクラス
class Post(db.Model):
    #郵便番号
    zip_code = db.StringProperty(required=True)
    #住所
    address = db.StringProperty(required=True)





データを登録する



postされた郵便番号、住所のデータをオブジェクトに設定し登録します。

    def post(self):
        #入力された郵便番号、住所を取得
        rquest_zip_code = self.request.get("zip_code")
        rquest_address = self.request.get("address")
        
        #データの登録実行
        post = Post(zip_code=rquest_zip_code, address=rquest_address)
        post.put()
        
        #最初の画面にリダイレクト
        self.redirect("/")



ちなみに、ブラウザから送信されたリクエストデータは、
self.request.get("パラメータ名")で取得できます。

Postオブジェクトを生成するとき、値を設定してしまいます。
これは、オブジェクトを生成した後
post.zip_code = "郵便番号"
post.address = "データ"
としてもOKなはず。

郵便番号登録用のオブジェクトは、db.Modelを継承しているので
それ自身が登録の機能を持っています。
オブジェクトのput()メソッドを呼ぶと、データの登録が実行されます。

データ型の詳細は、以下のURL参照
http://code.google.com/intl/ja/appengine/docs/python/datastore/typesandpropertyclasses.html



データを検索する



データの検索は、
・Query インターフェース
・GqlQuery インターフェース
の二通りがあります。

GqlQueryはSQLと同じような感覚で、データ取得用の命令文を実行する方式です。

以前、SQLAlchemyを試したことがあるので、今回はそのインターフェースに似た
Queryインターフェースを試すことにします。


指定した郵便番号に該当するデータを取得するには


query = Post.all()
query.filter('zip_code =', '検索したい郵便番号')

for result in query:
    print result.zip_code
    print result.address




これだけです。

Queryに関する詳しい記載は、以下のURLに掲載されています。
http://code.google.com/intl/ja/appengine/docs/python/datastore/queryclass.html



サンプルアプリケーションの全体像



■main.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

import wsgiref.handlers
from google.appengine.ext import webapp

#テンプレートを使用するため、下記二つのimportを追加
import os
from google.appengine.ext.webapp import template

#データベースを使用するため、importを追加
from google.appengine.ext import db

#データベース登録用のクラス
class Post(db.Model):
    #郵便番号
    zip_code = db.StringProperty(required=True)
    #住所
    address = db.StringProperty(required=True)

class MainHandler(webapp.RequestHandler):

    def get(self):
        zip_code = self.request.get("zip_code")
        template_values = {}
        
        if zip_code:
            query = Post.all()
            query.filter('zip_code =', zip_code)
            
            address = "対象のデータが見つかりません"
            for result in query:
                address = result.address
            
            #連想配列にテンプレートに渡す値を設定
            #テンプレートからは、連想配列のキーでアクセスする。
            template_values = {'zip_code' : zip_code, 'address' : address}
        
        #使用するテンプレートを指定
        path = os.path.join(os.path.dirname(__file__), 'template/index.html')
        #レンダリングを実行し、結果をレスポンスとしてブラウザに返却
        self.response.out.write(template.render(path, template_values))

    def post(self):
        #入力された郵便番号、住所を取得
        rquest_zip_code = self.request.get("zip_code")
        rquest_address = self.request.get("address")
        
        #データの登録実行
        post = Post(zip_code=rquest_zip_code, address=rquest_address)
        post.put()
        
        #最初の画面にリダイレクト
        self.redirect("/")
        
        
def main():
    application = webapp.WSGIApplication([('/', MainHandler)],
                                     debug=True)
    wsgiref.handlers.CGIHandler().run(application)


if __name__ == '__main__':
    main()






■template/index.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>テンプレート使用サンプル</title>
<body>
{% if zip_code %}
<h3>検索結果</h3>
郵便番号:{{ zip_code }}<br>
住所:{{ address }}<br>
{% endif %}

<h3>データ検索</h3>
<form method="get">
郵便番号:<input type="text" name="zip_code"><input type="submit" value="検索">
</form>
<br>
<h3>データ登録</h3>
<form method="post">
郵便番号:<input type="text" name="zip_code"><br>
住所:<input type="text" name="address"><br>
<input type="submit" value="登録">
</form>
</body>
</html>




登録してみます。

03_01_20091103212435.png


登録したデータを検索

03_02_20091103212435.png


検索結果
03_03_20091103212435.png


ちゃんと狙い通りに動いてくれました。


・・・まさか、データベース操作のプログラムをローカルデバッグ
できると思ってなかったので、ちょっと驚きました。




関連記事

コメント

非公開コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ