google app engine oil(GAEO)でbulkloaderを使う

コンバンハコンバンハ。
ue10000です。


GQLではQueryを投げたときに返ってくる件数の上限が1000件。
一回のQueryで帰ってくる上限1000件と30秒ルールを勘案すると、大量のレコードのカウントを表示したい場合なんかはどうすればいいんだろう???という疑問がわきます。とりあえず今回はCronで回して事前に加工しておくことで対応する方針です。動くかどうかの確認のために大量のレコード(エンティティだっけ?)が必要です。今回の開発ではgoogle app engine oil(GAEO)を使っているので、GAEOにあわせて書きます。


というわけでbulkloader使います。
公式ドキュメント:データのアップロード

では行ってみます。

サンプル用モデルを生成

$ cd project_root
$ gaeogen generate model samplemodel

ディレクトリを作って移動

$ cd project_root
$ mkdir bulkloader
$ cd bulkloader

生成されたモデル application/model/samplemodel.py

from google.appengine.ext import db
from gaeo.model import BaseModel, SearchableBaseModel

class Samplemodel(BaseModel):
    str = db.StringProperty()
    str2 = db.StringProperty()
    created_at  = db.DateTimeProperty(auto_now_add=True)
    updated_at  = db.DateTimeProperty(auto_now=True)

肝心のbulkloader project_root/bulkloader/sampleloader.py

# -*- coding: utf-8 -*-
import os
import sys

PROJECT_HOME="/mnt/windows/My Dropbox/project_root" # project_rootを絶対パスで指定
sys.path.append(PROJECT_HOME)

sys.path.append(os.path.join(PROJECT_HOME, 'application'))
sys.path.append(os.path.join(PROJECT_HOME, 'libs'))
sys.path.append(os.path.join(PROJECT_HOME, 'gaeo'))

# bulkloader
from google.appengine.tools import bulkloader
from model.samplemodel import Samplemodel

class SamplemodelLoader(bulkloader.Loader):
    def __init__(self):
        bulkloader.Loader.__init__(self, 'Samplemodel',
                                   [('str', lambda x: unicode(x, 'utf-8')),
                                    ('str2', lambda x: unicode(x, 'utf-8')),
                                    ])
loaders = [SamplemodelLoader]

実際にアップロード

$ python ../../google_appengine/appcfg.py upload_data --config_file bulkloader/sampleloader.py --filename=bulkloader/sample_csv_data.csv --kind=Samplemodel --url=http://10.0.2.15:3000/remote_api .

ちなみに日本語を突っ込みたい場合、unicode変換してあげないと文字コードでエラー吐きます。*1
もう少し突っ込んで大量のデータを入れてみたいと思います。*2

*1:python文字コード絡みはいまいちな気が

*2:Windows上のcoLinuxでの開発なんでちょっと読替が必要なところもありま