表題の件、覚書として書いておきます。
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 件のコメント:
コメントを投稿