2011年2月12日土曜日

Google App Engine、アプリケーションでデータベース共有

Web2pyでは、GAEに向けた開発では3つのモードがあります。
  1. GAEの本番、いわゆるProduction
  2. GAEのサンドボックス
  3. web2pyの実行
web2pyの開発環境は至れり尽くせりでViewやControllerを直接実行したり、編集したり、トラップしたときのトレースも不自由なくできます。
わたしはデータベースは面倒なのでsqliteを使っています。SQLite Database Bowser(http://sqlitebrowser.sourceforge.net)などはほとんど必要としません。
全部 この開発環境で開発からデバッグができます。
しかし問題がない訳ではありません。

それは
複数のアプリケーションの間のシェアです。マニュアルにはいろいろ書いてありますが、(http://www.web2py.com/book/default/chapter/04?search=cooperation#Cooperation)私にとっては、一向に要領を得ません。アプリケーションの間でセッションを共有しようとしたいのですが、結局はデータベースが共有できればよいのです。

SQLiteを使うとファイルシステムにストレージができます。web2pyではアプリケーションの下のディレクトリ、databasesです。
シンボリックリンクを使ってシェアしようとしたのですが、うまく行きません。

ところがこの問題はGAEのサンドボックスではないのでした。
GAEのサンドボックス、dev_appserver.pyはGoogleのデータベース、Big Tableをシミュレートしてくれます。
こちらはファイルシステムが使えません。アプリケーションのdb.pyに次のようなラインがあります。ここでmynamespaceがデータベースの名前空間を指定しているようです。
あるアプリケーションで定義したテーブルを別のアプリケーションのdb.pyで定義しておいて、その名前空間が同じならば、そのテーブルを共有できます。

if request.env.web2py_runtime_gae:            # if running on Google App Engine
    db = DAL('gae://mynamespace')             # connect to Google BigTable
    session.connect(request, response, db=db, masterapp=None)
 # and store sessions and tickets there
    ### or use the following lines to store sessions in Memcache
    # from gluon.contrib.memdb import MEMDB
    # from google.appengine.api.memcache import Client
    # session.connect(request, response, db = MEMDB(Client()))
else:                                         # else use a normal relational database
    db = DAL('sqlite://storage.sqlite')       # if not, use SQLite or other DB

データベースを覗くには、このURLでOKです。
 http://localhost:8080/_ah/admin

要するにまとめると、
web2py ---> dev_appserver.py ---> appcfg.pyでアップロードすればよいということでした。

もうひとつ便利なこと。
web2pyはlocalhost:8000でリッスン、サンドボックスは8080でリッスンします。だからブラウザの上で8000を8080とするだけで同じファンクションを2つの環境で試験できます。これは便利でした。