まず、以下のようなデータ モデルあるとして、
class Foo(db.Model): index = db.IntegerProperty()
Entityを取得する
Model.all()を使用してEntityを取得する。query = Foo.all()
Model.all()によって返される値はQueryオブジェクト。こんな風に取得しても良い。
query = db.GqlQuery('SELECT * FROM Foo')
# or
query = db.GqlQuery('SELECT __key__ FROM Foo')
db.GqlQuery()によって返される値はGqlQueryオブジェクト(のインスタンス)。「Entityを削除する」という目的の上ではどちらでも構わない。
Entityを削除する
上記のような操作によって取得したGqlQueryオブジェクト、またはQueryオブジェクトのEntityの数が一つであれば、db.delete(query)このようにしても問題なく
Entityを削除できる。しかし、取得した
Entityが複数である場合は例外が発生するBadArgumentError: Expected only one model or key
複数のEntityを一度に削除する
deleteメソッドの引数は以下。引用:関数 - Google App Engine - Google Code
削除するモデル インスタンス、エンティティの Key、エンティティのモデル インスタンスまたはキーのリスト。
つまり、複数のEntityを一度に削除するには
Modelインスタンスのリストにしてからdeleteメソッドに渡す必要がある。Modelインスタンスのリストにするにはfetchメソッドを使用する。query.fetch(limit)
fetchの戻り値は「Modelインスタンス or 空」のリストその後、
db.delete()で削除すれば良い。db.delete(model_list)
まとめるとこんな流れになる。
query = Foo.all() m_list = query.fetch(100) db.delete(m_list)
Entityの数が多い、または削除したいModelの種類が複数なら、以下のようなメソッドを用意する。def clear_data(model): try: q = model.all() while q.count(): m = q.fetch(100) db.delete(m) q = model.all() except: return
tryで囲む必要はないかも。使い方。
clear_data(Foo)
違う書き方をするならこんな感じかな。
def clear_data(model): s = 'SELECT * FROM %s' % model.entity_type() q = db.GqlQuery(s).fetch(100) while len(q): db.delete(q) q = db.GqlQuery(s).fetch(100)





0 Comments:
コメントを投稿