ブロガーの実験室スポンサー広告
> google apps engine Delete> ブロガーの実験室パソコンな日々
> google apps engine Delete
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


--.--.--|スポンサー広告||TOP↑

[]AppEngineでKind(テーブル)を削除する方法 22:05 AppEngineでKind(テーブル)を削除する方法 - あおうさ@日記 を含むブックマーク はてなブックマーク - AppEngineでKind(テーブル)を削除する方法 - あおうさ@日記 AppEngineでKind(テーブル)を削除する方法 - あおうさ@日記 のブックマークコメントAdd Star

Google App Engineではデータを削除したい時にサーバのデータに対してDelete文を実行したりDrop Tableしたりということができません。Kindをdrop(KindにあるEntity[レコード]を全件削除)するには現時点では削除するコードを サーバにデプロイして ブラウザからリクエストを送ります。そこで使用するソー スコードを紹介します。

import java.util.ArrayList;
import java.util.List;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.DatastoreTimeoutException;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Query;

    public static void dropKind(String kindName) {
        DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
        Query query = new Query(kindName);
        query.setKeysOnly();
        List<Entity> list =
            ds.prepare(query).asList(FetchOptions.Builder.withOffset(0)); // ※DatastoreTimeoutException の可能性がありますが省略しています。
        List<Key> keys = new ArrayList<Key>(500);
        for (Entity entity : list) {
            keys.add(entity.getKey());
            if (keys.size() == 500) {
                try {
                    ds.delete(keys); // batch delete
                } catch (DatastoreTimeoutException ignore) {
                }
                keys.clear();
            }
        }
        if (keys.size() > 0){
            ds.delete(keys); // batch delete ※DatastoreTimeoutException の可能性がありますが省略しています。
        }
    }

使い方は簡単でdropKindの引数にKind名を指定するだけです。おそらくJDOを使っている人は下記のようなコードになると思いま す。

例)dropKind(Emp.class.getSimpleName());

  • 解説
    • KindのKey(PK)を全件取得
      • KindのKeyを取得する際に、query.setKeysOnly();をしています。データ(プロパティ値)が不要な場合は setKeysOnlyすることで取得が4倍近く早くなります。
    • KeyをListに詰める
      • DatastoreServiceのdeleteは1つのKeyを引数に取ることもできますが、KeyをListに詰めた後に ds.delete(keys);する事でbatch deleteとなり高速に削除できます。
    • 500件毎にdelete
      • 500件毎に削除しているのはDatastoreServiceのput(insert/update)およびdeleteは最大 500件だからです。
    • ※DatastoreTimeoutExceptionをtry catch。DatastoreTimeoutExceptionが発生したら途中まで消えたり消えなかったりします。

*一応書いておくと、このメソッド一回で確実にKindをDropすることを保証するものではありません。何回も実行して下さいな。もし、こ れでも件数が多くてだめな場合はTaskQueueで件数を分割して投げまくって下さい。



2010.06.22|パソコンな日々コメント(0)TOP↑
名前:
コメントタイトル:
メールアドレス:
URL:
コメント:

パスワード:
管理人だけに表示:
管理者にだけ表示を許可
カテゴリー
最近の記事
最近のコメント
最近のトラックバック
ブログ検索
管理人のブログ一覧
管理人へメール

名前:
メール:
件名:
本文:

月別アーカイブ
プロフィール

やまもも実験室

Author:やまもも実験室
FC2ブログへようこそ!

RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。