箱が…

Amazon箱ストラクチャーが崩れてきそうです。ダンボー作ろうかな。

Google App Engine Oilのモデル(のデータ)をbulkloaderでうpる

こんばんは。

今年の初めに「ちょっと作り直すわ」などと宣言されたおかげで下火になりつつある感がするGAEOですが、以下はGAEOのモデルを継承して定義した俺datastoreモデルをbulkloaderでアップロードする方法のメモです

結論から言うとちゃんと(ローカルのテスト鯖に)アップロードできたので、最後まで読んでね

import path

GAEOのプロジェクトルートディレクトリにmain.pyがありますが、ここでは以下のディレクトリをsys.pathに追加してます

さてこのパスですが、GAEのappcfg.pyはそんなもの知るはずもないのでちゃんと教えてあげましょう

Loader

ではデータのアップロードに従ってローダーを書きましょう

ディレクトリ構成
base_directory
  + bulkloader (ここでappcfg.pyを実行)
    + hogeloader.py (ローダースクリプト)
    + hoge.csv (アップロードするデータ)
  + project_root
    + app.yaml
    + application
        + model
          + hoge.py (Hogeクラスが書いてある)
hoge.py
# coding: utf-8
from google.appengine.ext import db
from gaeo.model import BaseModel

class Hoge(BaseModel):
  piyo = db.StringProperty()
hogeloader.py
# coding: utf-8

import os
import sys

# current path
cur_path = os.path.abspath( os.path.dirname(__file__) )
sys.path.append( cur_path )

# application directory
app_path = os.path.join( cur_path, '..', 'project_root')
sys.path.insert(0, app_path)
# libraries
sys.path.insert( 0, os.path.join(app_path, 'libs') )
# model / template / controller
sys.path.insert( 0, os.path.join(app_path, 'application') )

# bulkloader
from google.appengine.tools import bulkloader

# model
from model.hoge import Hoge

class HogeLoader(bulkloader.Loader):
  def __init__(self):
    bulkloader.Loader.__init__( self,
      'Hoge',
      [
        ('piyo', str)
      ]
    )

loaders = [HogeLoader]
実行

では上記のbulkloaderディレクトリにcdしてappcfg.pyを実行するわけですが、私の環境ではパス通してないのでファイルをpythonインタプリタに直接渡します

というかWindowsだとappcfg.pyを直接呼び出した場合拡張子の関連付けで実行されるのでオススメできません

python "C:\Program Files\Google\google_appengine\appcfg.py" upload_data --config_file=hoge.py --filename=hoge.csv --kind=Hoge --url=http://localhost:8080/remote_api ..\project_root

こんな感じで。