私の質問は次のようなものだと思います: BulkLoader -export_transform OR https://stackoverflow.com/questions/3220911/gae-datastore-export-transform
基本的に、バルクローダーを使用して、作成したエンティティをバックアップおよび復元しています。テストするために、「ゲーム」の種類を使用して、それを game.csv という名前の csv ファイルに出力しています。
これは私が経験するプロセスです:
以下を使用してゲームの種類を 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
すべてのゲーム エンティティを削除します。次に、アプリの管理ポータルのデータストア ビューアー タブを確認したところ、データ ストアにエンティティがなくなっていることがわかりました。
以下を使用して作成した 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
「名前」でエンティティを取得するサーブレットを実行します (これは、以下の 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 =12345、ID=67890 ... のID/NAME
ようなハイパーリンクを含む列を表示します。
アップロード後、datastire ビューアは、エンティティ行ごとに NAME =12345、NAME=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
}