Google App EngineのDataStoreに格納しているデータをローカル環境で利用する

=== 追記 2019/3/9 ===
2019年のやりかたで書き直しました。
本番のCloud Datastoreのデータを、ローカル環境にインポートする - Qiita

=== 追記終わり ===


試験データを作成するのが面倒だったので、ダンプしてローカルで利用しようと思い、
ググったら出てきたので、メモ。
(下記、appname=my-android-server です。)


基本的には、
http://kopipeprogrammer.blogspot.jp/2011/02/google-app-engine-bulk-loader.html
を参考に、
https://developers.google.com/appengine/docs/python/tools/uploadingdata?hl=ja
を参照しました。


実際に欲しかったのは、全てのデータだったので、

  • builtins ディレクティブを使用した remote_api のインストール
  • 全データのダウンロードとアップロード

を行ったのですが、

google.appengine.api.datastore_errors.BadRequestError: app s~my-android-server cannot access app my-android-server's data

と、エラーになってしまいました。
記号がある場合に変になるのかと思い、applicationパラメータの指定バッククォートで囲み、

appcfg.py download_data --application=`my-android-server` --url=http://my-android-server.appspot.com/_ah/remote_api --filename=./dump.datastore

に変更したところ、正常に動作しました。
ハイフンなどの記号がある場合、バッククォートで囲めばなんとかなるっぽいです。
取得したデータ量と、かかった秒数的には下記の通り。

16962 entities (4560394 bytes) transferred in 871.2 seconds

ちなみに、Datastore Read Operations は40%まで上がりました(通常は数%)


次に、起動時の"--datastore_path"パラメータに、dump.datastoreを指定したのですが、

ERROR    2013-02-12 14:08:51,099 dev_appserver_main.py:691] <class 'google.appengine.runtime.apiproxy_errors.ApplicationError'>: ApplicationError: 3 Could not read data from /Users/ishikuranoboru/workspace/python/kyouen-python/src/kyouen.datastore. Try running with the --clear_datastore flag. Cause:
ValueError('insecure string pickle',)

というエラーとなってしまいました。
エラーメッセージなどでググると、
https://groups.google.com/forum/?fromgroups=#!topic/google-appengine/H7hYxKHvmC0
が見つかり、

appcfg.py upload_data --url=http://localhost:8080/_ah/remote_api --application=`dev~my-android-server`  --filename=dump.datastore --num_threads=5

を実行したところ、インポートが始まりました。("--application"に、"dev~"+を指定)
投入にも同じぐらいの秒数がかかりました。

16962 entities (4211170 bytes) transferred in 848.2 seconds


実際の画面やSDK Consoleを確認すると、本番のデータが表示されました。


高負荷かつ長時間かかるため、頻繁には使えないと思いますが、本番である程度データが溜まった場合は、これを利用してローカルにテストデータを投入出来そうです。