1

私の質問は次のようなものだと思います: BulkLoader -export_transform OR https://stackoverflow.com/questions/3220911/gae-datastore-export-transform

基本的に、バルクローダーを使用して、作成したエンティティをバックアップおよび復元しています。テストするために、「ゲーム」の種類を使用して、それを game.csv という名前の csv ファイルに出力しています。

これは私が経験するプロセスです:

  1. 以下を使用してゲームの種類を game.csv にダウンロードします。

    appcfg.py download_data --config_file=bulkloader.yaml --kind=Game --filename=game.csv --application=MyAppId --url= http://MyAppId.appspot.com/remote_api --rps_limit=500 -- bandwidth_limit=2500000 --batch_size=100

  2. すべてのゲーム エンティティを削除します。次に、アプリの管理ポータルのデータストア ビューアー タブを確認したところ、データ ストアにエンティティがなくなっていることがわかりました。

  3. 以下を使用して作成した game.csv を使用して、ゲームの種類をアップロードします (コマンドはdownload_dataと同じですが、 upload_data を使用します) :

    appcfg.py upload_data --config_file=bulkloader.yaml --kind=Game --filename=game.csv --application=MyAppId --url= http://MyAppId.appspot.com/remote_api --rps_limit=500 -- bandwidth_limit=2500000 --batch_size=100

  4. 「名前」でエンティティを取得するサーブレットを実行します (これは、以下の Game.java に示されているプロパティです)。

次のエラーが発生します。

Uncaught exception from servlet
java.lang.IllegalStateException: Loaded Entity has name but com.example.app.model.Game has no String @Id
    at com.googlecode.objectify.impl.ConcreteEntityMetadata.setKey(ConcreteEntityMetadata.java:343)
    at com.googlecode.objectify.impl.ConcreteEntityMetadata.toObject(ConcreteEntityMetadata.java:210)
    at com.googlecode.objectify.impl.QueryImpl$ToObjectIterator.translate(QueryImpl.java:640)
    at com.googlecode.objectify.impl.QueryImpl$ToObjectIterator.translate(QueryImpl.java:629)
    at com.googlecode.objectify.util.TranslatingIterator.next(TranslatingIterator.java:35)
    at com.googlecode.objectify.impl.QueryImpl.list(QueryImpl.java:470)

これは、bulkloader.yamlファイルがプロパティに対して正しく構成されていないことに関係していると思われ__key__ます。というわけで以下に掲載しました。

- 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: Game
  connector: csv
  connector_options:
    # TODO: Add connector options here--these are specific to each connector.
  property_map:
    - property: __key__
      external_name: key
      export_transform: transform.key_id_or_name_as_string

    - property: __scatter__
      #external_name: __scatter__
      # Type: ShortBlob Stats: 56 properties of this type in this kind.

    - property: genre
      external_name: genre
      # Type: String Stats: 6639 properties of this type in this kind.

    - property: name
      external_name: name
      # Type: String Stats: 6639 properties of this type in this kind.

    - property: releasedate
      external_name: releasedate
      # Type: Date/Time Stats: 6548 properties of this type in this kind.
      import_transform: transform.import_date_time('%Y-%m-%dT%H:%M:%S')
      export_transform: transform.export_date_time('%Y-%m-%dT%H:%M:%S')

データの削除とアップロードの前に、「ゲーム」の種類 (アプリの管理ポータルのデータストア ビューアー タブ内) は、エンティティ行ごとに ID =12345ID=67890 ... のID/NAMEようなハイパーリンクを含む列を表示します。

アップロード後、datastire ビューアは、エンティティ行ごとに NAME =12345NAME=67890ID/NAME ... のようなハイパーリンクを含む列を表示します。


考えられる原因は?

実際に質問をhttps://groups.google.com/forum/?hl=en#!topic/objectify-appengine/FFuB2Onfnzc__key__に投稿しましたが、プロパティを文字列に変換するのを避けるための構文がわかりませんデータをアップロードします。

Jeff (Objectify3.0 の作成者) は次のように述べています。

エラー メッセージには、データストア内のデータが文字列名のキーであることが示されていますが、Game エンティティには数値の Long @Id があります。バルクローダーの構文はよくわかりませんが、最も疑わしい行は次のとおりです。

export_transform: transform.key_id_or_name_as_string

ここですべての数値 ID を文字列に変換しているように見えますが、これが問題になります。それらを数字のままにしておきます。

を削除しようとしましたexport_transform: transform.key_id_or_name_as_stringが、ダウンロードすると csv ファイルが空です。

--config_fileパラメータとbulkloader.yamlファイルの使用を避け、バルクローダーに変換せずにデータをダウンロード/アップロードさせることが解決策になるのでしょうか?


関連する可能性がある場合の追加情報

objectify3.0.jar を使用して GAE データストアを操作しています。したがって、私のゲームの種類は次のようになります。

public class Game {
    @Id private Long id; //This is my key property, auto generated by objectify  
    private String name;
    private String genre; 
    private Date releasedate;

    //ommitting getters and setters 
}
4

2 に答える 2

1

私はいくつかの実験をしました、そして私は私が解決策を持っていると信じています。

私が尋ねた別のstackoverflowの投稿から実際にアイデアを得ました:Java GoogleAppEngineバルクローダーを使用してデータストア全体を1つのcsvファイルにダウンロードする

--config_file修正は、との使用を避けることbulkloader.yamlです。

私は以下を使用して、あらゆる種類のファイルを1つのcsvファイルにダウンロードしました。

appcfg.py download_data --filename=backup.csv --application=MyAppId --url=http://MyAppId.appspot.com/remote_api --rps_limit=500 --bandwidth_limit=2500000 --batch_size=100

以下を使用して、単一のcsvファイルをデータストアにアップロードしました。

appcfg.py upload_data --filename=backup.csv --application=MyAppId --url=http://MyAppId.appspot.com/remote_api --rps_limit=500 --bandwidth_limit=2500000 --batch_size=100

それらは同じコマンドですが、ただdownload_data交換upload_dataされています。

アイデアは、appcfgにすべてのエンティティ(種類固有ではない)をダウンロードおよびアップロードさせることです。つまり、エクスポートまたはインポート変換を使用しません。

于 2011-05-16T23:55:49.607 に答える