2011年6月15日水曜日

手元にあるcsvファイルをGAEにアップロードする方法

表題の件、覚書として書いておきます。

GAE(Google App Engine)のデータストアには2種類あります。
1.High Replication Datastore
2.Master/Slave Datastore

アプリケーション登録時に明示的に指定しないと1が自動的に選択されます。
一度選択してしまうと、後で変更はできません。

ここで示すデータのアップロードは1では動作しませんでした。
2を選択した場合のお話です(本当は1で動作させたいのだけれど)。


【1】以下のようなフォルダ構成を考えます。
    application/
       main.py
       app.yaml
       models.py
       bulkloader/
           link.csv
           loaders.py

main.pyはアプリ本体を記述したファイル、app.yamlは設定ファイルです。

【2】まず最初に、設定ファイルapp.yamlに以下3行を追加します(アプリ本体の設定は省略します)。
    - url: /remote_api
      script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
      login: admin

ここで注意しなければならない行は
          script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
です。$PYTHON_LIBは一字一句このまま記述しなければなりません。
勘違いして自分の環境変数に置き換えてはいけません(置き換えるとはまります)。

【3】link.csvは2つのカラムfromidとtoidを持ち、これらはint型であるとします。
このとき、models.py内に以下を実装します。

    from google.appengine.ext import db

    class Link(db.Model):
        fromid = db.IntegerProperty()
        toid = db.IntegerProperty()


【4】続いて、これに対応したloaderクラスをloaders.pyに実装します。

    from google.appengine.tools import bulkloader
    import sys
    import os.path
    sys.path.append(
            os.path.abspath(
                    os.path.dirname(
                            os.path.dirname(
                                    os.path.realpath(__file__)
                            )
                    )
            )
    )

    from models import *

    class LinkLoader(bulkloader.Loader):

        def __init__(self):

            bulkloader.Loader.__init__(
                self
              , "Link"
              , [
                    ("fromid", int)
                  , ("toid", int)
                ]
            )


    loaders = [LinkLoader]

models.pyが見えるように、sys.pathには1つ上のパスを追加しています(もっと良い書き方があると思うけど)。
末尾にグローバルな配列loadersを定義します。


【5】この2つのクラスがcsvからデータストアへの変換法則を決めます。
models.pyはアプリ本体でも参照するファイルなので、bulkloaderフォルダにはおかずにapplicationフォルダに
おきました。

【6】アプリ本体をアップロードします。
    $> appcfg.py update application

【7】次にデータをアップロードします。bulkloaderフォルダに入ったあと以下を実行します。

    $> appcfg.py upload_data --config_file=loaders.py --filename=link.csv \
      --kind=Link ..

    このコマンドは、link.csv内のデータを、クラスLinkとLinkLoaderを使って、bigtable内に格納します。

文責:くまだ

0 件のコメント:

コメントを投稿