Google App Engine Oilのモデル(のデータ)をbulkloaderでうpる
こんばんは。
今年の初めに「ちょっと作り直すわ」などと宣言されたおかげで下火になりつつある感がするGAEOですが、以下はGAEOのモデルを継承して定義した俺datastoreモデルをbulkloaderでアップロードする方法のメモです
結論から言うとちゃんと(ローカルのテスト鯖に)アップロードできたので、最後まで読んでね
import path
GAEOのプロジェクトルートディレクトリにmain.pyがありますが、ここでは以下のディレクトリをsys.pathに追加してます
- main.pyのあるディレクトリ(プロジェクトのルートディレクトリ)
- applicationディレクトリ(modelとかcontrollerとかのディレクトリが入ってるやつ)
- libsディレクトリ(プロジェクトルートの直下, 用途よくわからん)
さてこのパスですが、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
こんな感じで。