これまで本ブログでは、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メソッド」を実行するだけの簡単なものでした。ぜひ利用してみてください。