Google App EngineとGoogle Cloud Datastoreとの連携

これまで本ブログでは、Google App Engine (GAE) とGoogle Cloud Datastore (GCD)を紹介し、その素晴らしさを述べさせていただきました。もちろんこの2つは連携することが可能です。今回は、Pythonでこの2つの連携の仕方を紹介したいと思います。(完全なソースコードは最後に記します。

利用するライブラリ

GAEからGCDを利用するために利用するライブラリは「Google Datastore NDB Client Library」です。Pythonのソースコード上では次のように記します。
from google.appengine.ext import ndb

Entityの作り方

GCDでは、RDBのテーブルに相当するエンティティが必要になります。このエンティティは、Python上ではclassとして定義します。例えばUsersエンティティであれば、次のように記します。
class Users(ndb.Model):
    name = ndb.StringProperty(indexed=True)
    age = ndb.IntegerProperty(indexed=False)
    created_at = ndb.DateTimeProperty(indexed=False)
プロパティのタイプは次のように指定します。
  • 文字列 … ndb.StringProperty
  • 数値 … ndb.IntegerProperty
  • 日時 … ndb.DateTimeProperty
検索のためにインデックスを貼るのであれば、「indexed=True」と指定します。 GAEとGCDとの連携で特徴的なのは、事前にGCDでエンティティの作成が必要ないことです。RDBであれば、データをInsertする前にCreate Tableでテーブルを用意しておく必要がありますが、GCDでは何もない状態でエンティティを追加することができます。そのため、GCD上での事前準備は全く必要ありません。

エンティティの追加

エンティティの追加は、非常に簡単です。次のソースコードを見てください。
user = Users(
    name='hoge',
    age=25,
    created_at=datetime.datetime.now()
)
user.put()
1行目は、Usersエンティティの用意を行っています。ここではname, age, created_atプロパティを設定しています。エンティティの全てを設定する必要はなく、必要なプロパティのみ設定しただけでも大丈夫です。 5行目は、用意したエンティティをGCDに送信し、エンティティ作成処理を行っています。

エンティティの検索

エンティティの検索も、非常に簡単です。次のソースコードを見てください。
query = Users.query(Users.name == 'hoge')
user = query.get()
エンティティの検索は1行目のようにqueryメソッドを用い、検索するための条件を記します。2行目は検索クエリをGCDに送信し、エンティティを取得します。

完全なソースコード

それでは完全なソースコードを記します。GAE側ではFlaskを利用していますので、実行にはURLを叩けば大丈夫です。Google Cloud SDKをインストールしているのであれば、ローカルでも実行することができます。
# coding: UTF-8
from google.appengine.ext import ndb
from flask import Flask, jsonify
import datetime
app = Flask(__name__)


class Users(ndb.Model):
    name = ndb.StringProperty(indexed=True)
    age = ndb.IntegerProperty(indexed=False)
    created_at = ndb.DateTimeProperty(indexed=False)


@app.route('/create_user')
def create_user():
    user = Users(
        name='hoge',
        age=25,
        created_at=datetime.datetime.now()
    )
    user.put()

    return ''


@app.route('/search_user')
def search_user():
    query = Users.query(Users.name == 'hoge')
    user = query.get()

    ret = {
        'name': user.name,
        'age': user.age
    }

    return jsonify(ret)


if __name__ == '__main__':
    app.run()

まとめ

いかがでしたでしょうか。GAEとGCDとの連携を難しく考えていた方もいるようでしたが、エンティティの追加は「putメソッド」・エンティティの検索は「getメソッド」を実行するだけの簡単なものでした。ぜひ利用してみてください。
» お仕事のご依頼はこちら