まず、以下のようなデータ モデルあるとして、
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:
コメントを投稿