8

GAE データストアに格納された永続クラスがあります。クラスから属性の 1 つを削除しました。このテーブルの新しいレコードは<none、削除された属性の値 > を示しています。しかし、この列をテーブルから完全に削除する方法はありますか?

ありがとう。

moraes の提案に従って、次の「移行」コードを追加しましたが、目的の結果が得られません。

PersistenceManager pm = PMF.get().getPersistenceManager();
try {
    Query q = pm.newQuery(UserLogin.class);
    Collection<UserLogin> list = (Collection<UserLogin>) q.execute();

    Iterator<UserLogin> iter = list.iterator();
    while (iter.hasNext()) {
        UserLogin obj = (UserLogin) iter.next();
        obj.setLoginDate(obj.getLoginDate());
    }

    pm.makePersistentAll(list); 

} finally {
    pm.close();
}
4

4 に答える 4

7

この記事でこの問題の答えを見つけました: http://code.google.com/appengine/articles/update_schema.html

"削除されたプロパティをデータストアから削除する

モデルからプロパティを削除すると、既存のエンティティにはまだプロパティがあることがわかります。これは引き続き管理コンソールに表示され、データストアにも存在します。古いデータを完全に消去するには、エンティティを循環させて、それぞれからデータを削除する必要があります。

  • モデル定義からプロパティを削除したことを確認してください。

  • モデル クラスが db.Model から継承している場合は、一時的に db.Expando から継承するように切り替えます。(db.Model インスタンスは動的に変更できません。これは、次のステップで行う必要があります。)

  • 既存のエンティティを循環します (上記のように)。エンティティごとに、delattrを使用して廃止されたプロパティを削除し、エンティティを保存します。

  • モデルが最初に db.Model から継承されたものである場合は、すべてのデータを更新した後に元に戻すことを忘れないでください。"

コードの例を次に示します: http://sandrylogan.wordpress.com/2010/12/08/delattr/

于 2012-03-12T05:50:34.620 に答える
7

を使用している場合ndb(おそらく使用する必要があります)、プロパティを から削除することで簡単に削除できますentity._properties

for entity in MyModel.query():
    if 'old_property' in entity._values:
        del entity._properties['old_property']
        del entity._values['old_property']
        entity.put()

または、非同期 クエリ マップを使用して高速化することもできます。

@ndb.tasklet
def cleanup(entity):
    if 'old_property' in entity._values:
        del entity._properties['old_property']
        del entity._values['old_property']
        yield entity.put_async()

MyModel.query().map(cleanup)
于 2013-02-27T15:35:28.513 に答える
5

データストアには「テーブル」の概念はありません。各エンティティは、共通のスキーマに従わない任意のプロパティを持つことができます。唯一の「スキーマ」はモデルコードにあり、モデルを変更しても既存のレコードは自動的に変更されません。

したがって、既存のレコードからプロパティを削除するには、すべてのレコードを繰り返し処理し、プロパティなしでそれらを再保存する必要があります。

于 2011-05-16T11:31:23.577 に答える
3

データストア ビューアは、定期的に更新されるデータストア統計から列のリストを取得します。その列を持っていたすべてのエンティティからその列を削除した場合は、1 日か 2 日待つと、データストア ビューアーに列が表示されなくなります。

于 2011-05-16T22:06:19.040 に答える