2011-02-09 10 views
4

私はこのように私のpythonのApp Engineサーバーからエントリを削除することについてつもりです:それはちょうど醜いに思えるし、私はそれは完全に信頼性がありません疑う保つ..but削除エンティティ

try: 
     while True: 
      q = db.GqlQuery("SELECT __key__ FROM SampleData") 
      assert q.count() 
      db.delete(q.fetch(400)) 
      time.sleep(0.2) 
     except Exception, e: 
     self.response.out.write(repr(e)+'\n') 
     pass 

     try: 
     while True: 
      q = db.GqlQuery("SELECT __key__ FROM UserData") 
      assert q.count() 
      db.delete(q.fetch(400)) 
      time.sleep(0.2) 
     except Exception, e: 
     self.response.out.write(repr(e)+'\n') 
     pass 

。これらのwhileループのそれぞれを作成するのではなく、いくつかの型のエントリを削除するには、これをよりうまくいく方法がありますか?

更新:私はこれをcronジョブを介して定期的に実行しているので、手動で(管理コンソールなどで)実行したくないという制限があります。

答えて

3

いくつかの改善点:

  1. あなたが時間によって終了しない場合は、別のタスクをタスクキューを使用する必要がありますし、チェーンに調製された各バッチ
  2. 後にスリープ状態にする必要はありません期限が迫った。
  3. カーソルを使用する必要があります。そうしないと、後続のクエリでは、既存の行に到達するために既に削除したすべての「廃棄済み」行をスキップする必要があります。

大部分またはすべての種類を削除する場合は、代わりにmapreduceライブラリを使用することができます。

4

あなたは、詳細についてはこちらをご覧ください、種類のすべてのエンティティを削除するには、管理コンソールのデータストアの管理]タブを使用することができます。

http://code.google.com/appengine/docs/adminconsole/datastoreadmin.html#Deleting_Entities_in_Bulk

+0

ありがとう、役に立つリンク。残念なことに、これらを定期的にcronジョブの一部として削除していることを忘れていました。デバッグなどでエンティティをリセットするためにブランケットしたいときには何もしません。質問を更新します。曖昧さを残して申し訳ありません。 – Joey

0

あなたが大量のデータを削除したい場合は、あなたが望むかもしれませんGoogleが提供するdeferredライブラリを使用する - cronジョブを持っているのバッチで、あなたのオブジェクトを削除することができ、遅延タスクを、キックオフ:あなたはおそらく、新しいmapreduceのLiBrと似て行うことができます

class DeleteMapper(mapper.Mapper): 
    KIND = MyKindOfObject 

    # Delete all objects of type MyKindOfObject. 
    def map(self, key): 
     todelete = [key] 
     return ([], todelete) 

しかし、私はあなたのための例はありません。

関連する問題