/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

GoogleAppEngine: Datastore からのエクスポート方法

GAE は基本的にはプログラムから API を叩く必要があり、管理画面からボタンを押せばデータのエクスポートができる訳ではありません。いろいろと設定も必要だったので、メモしておきます。

以前の記事 GoogleAppEngine ことはじめ も合わせてどうぞ。

参考情報

GAE は Google developers が設定例豊富なのでとても親切です。逆に日本語情報が少ないので、困ったときには stackoverflow が役に立ちます。

Google developers: Uploading and Downloading Data in Python
アップロードとダウンロード方法についてのドキュメントです。

Google developers: Structuring Data for Strong Consistency
後述する、High Replication の仕組みについてのドキュメントです。

stackoverflow: How can I export data from Google App Engine High Replication datastore?
High Replication の場合のデータエクスポート方法についてのQ and A です。

前提: Datastore には2種類ある

GAE の Datastore には "Storage Scheme" という項目があり、"master/slave datastore" か "High Replication" が設定されているようです。"master/slave datastore" は deprecated と公式ドキュメントに繰り返し記載されており、これから利用される方であれば "High Replication" が選択されているかと思います:

GAEスクリーンショット

"High Replication" の場合は書き込みの反映がやや遅れることから、書き込んだデータが即時ダウンロード可能にならない点に注意が必要とのことです。

設定例

app.yml

API へ接続可能なように設定します。

# app.yml には application や version の指定が必要ですが、割愛します

builtins:
- remote_api: on
handlers:
- url    : /remote_api
  script : $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
  login  : admin

bulkloader.yml

ダウンロード・アップロードの設定をします。

各属性値がどのような値を取るのかや、出力・入力のファイルフォーマットも指定可能です。ここではダウンロードするときに、日付型を '%Y/%m' の形式にして出力するようにしています。("Member" という値がありますが、これはテーブル名を指します。)

# If you have module(s) with your model classes, add them here. Also
# change the kind properties to model_class.
python_preamble:
- import: base64
- import: re
- import: google.appengine.ext.bulkload.transform
- import: google.appengine.ext.bulkload.bulkloader_wizard
- import: google.appengine.ext.db
- import: google.appengine.api.datastore
- import: google.appengine.api.users

transformers:
- kind: Member
  connector: csv
  connector_options:
  property_map:
    - property: __key__
      external_name: key
      export_transform: transform.key_id_or_name_as_string
    - property: date_of_enter
      external_name: date_of_enter
      import_transform: transform.import_date_time('%Y/%m')
      export_transform: transform.export_date_time('%Y/%m')
    - property: division
      external_name: division

実行

appcfg.py に download_data パラメータを与えて、ダウンロードを実行します。全てのデータをダウンロードすることも可能ですが、kind パラメータを付ければ特定のテーブルのみダウンロード可能です。

$ appcfg.py download_data¥
      --config_file=bulkloader.yaml¥
      --filename=download.csv¥
      --kind=Member¥
      --url=http://.appspot.com/_ah/remote_api