Entityの削除について - GAE

まず、以下のようなデータ モデルあるとして、

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:

Sony Style(ソニースタイル)
デル株式会社

Recent Posts