GAEでブログする時に気になる記事のバックアップ、リストア方法(CSV編)

このエントリーをはてなブックマークに追加

前回 はGAEのDataStoreをバイナリでバックアップする方法を紹介した訳ですが、これではバックアップした内容をチェックしたり、修正したり、他のアプリに移行したり色々と不便なこともあるので、今回はDataStoreをCSVでバックアップ、リストアする方法を書きます。

CSVでバックアップ、リストアするためにはBulk loaderを使います。その時各カラムのデータ変換方法を書く必要があるのですが、その方法として、設定ファイルを使う方法とコードを書く方法があります。今回はコードを書く方法はGAEでは非推奨となっていますので、設定ファイルを使う方法でやりました。

手順は次の通りです 1. Remote APIを有効にする(app.yamlに追加) これは _前回 と同じです 2. 設定ファイルを作成する
C:\Python\Python.exe appcfg.py create_bulkloader_config --application=fuga
--url=http://fuga.appspot.com/_ah/remote_api
--filename=C:\hoge\fuga\bulkloader.yaml C:\hoge\fuga

これでC:hogefugaフォルダにbulkloader.yamlが出来ます 3. 設定ファイルを変更する bulkloader.yamlを編集して、実際にバックアップ、リストアが出来るようにします。例としてGAE本家サイトの「 データのアップロードとダウンロード 」を引用します
    transformers: - kind: Permission

    System Message: ERROR/3 (<string>, line 21)
    Unexpected indentation.

        connector: # TODO: Choose a connector here: csv, simplexml, etc... connector_options:

        System Message: ERROR/3 (<string>, line 23)
        Unexpected indentation.

            # TODO: Add connector options here--these are specific to each connector.

        System Message: WARNING/2 (<string>, line 24)
        Block quote ends without a blank line; unexpected unindent.

        property_map:

                property: __key__ external_name: key export_transform: transform.key_id_or_name_as_string
                property: account external_name: account # Type: Key Stats: 119 properties of this type in this kind. import_transform: transform.create_foreign_key('TODO: fill in Kind name') export_transform: transform.key_id_or_name_as_string
                property: invite_nonce external_name: invite_nonce # Type: String Stats: 19 properties of this type in this kind.
                property: role external_name: role # Type: Integer Stats: 119 properties of this type in this kind. import_transform: transform.none_if_empty(int)
                property: user external_name: user # Type: Key Stats: 119 properties of this type in this kind. import_transform: transform.create_foreign_key('TODO: fill in Kind name') export_transform: transform.key_id_or_name_as_string

上のTODO:と書いてあるところを適切に修正します。修正後の結果も引用します
        kind: Permission

    System Message: WARNING/2 (<string>, line 53)
    Bullet list ends without a blank line; unexpected unindent.

    connector: csv property_map:

    System Message: ERROR/3 (<string>, line 55)
    Unexpected indentation.

            property: __key__ external_name: key export_transform: transform.key_id_or_name_as_string
            property: account external_name: account import_transform: transform.create_foreign_key('Account') export_transform: transform.key_id_or_name_as_string
            property: invite_nonce external_name: invite_nonce
            property: role external_name: role import_transform: transform.none_if_empty(int)
            property: user external_name: user import_transform: transform.create_foreign_key('User') export_transform: transform.key_id_or_name_as_string

4. バックアップ
C:\Python\Python.exe appcfg.py download_data --application=fuga
--url=http://fuga.appspot.com/_ah/remote_api
--filename=C:\hoge\fuga\bkup.csv --kind=Permission
--config_file=C:\hoge\fuga\bulkloader.yaml C:\hoge\fuga

バックアップ、リストアでは必ず--kindを指定します。そうすると--kindで指定したEntityのバックアップが取れます。

5. リストア
C:\Python\Python.exe appcfg.py upload_data --application=fuga
--url=http://fuga.appspot.com/_ah/remote_api
--filename=C:\hoge\fuga\bkup.csv --kind=Permission
--config_file=C:\hoge\fuga\bulkloader.yaml C:\hoge\fuga

とするとリストア出来るのですが・・・・cpedialogやbloggartでやってみると、idで入って欲しいところがnameで入ったり、タグが登録出来なかったりと色々と問題が出ました。それについての対処法は次回とか書いてたけど、もう書かないかな。
gae