Как удалить столбец (атрибут) из хранилища данных GAE? - PullRequest
8 голосов
/ 16 мая 2011

У меня есть постоянный класс, хранящийся в хранилище данных GAE.Я удалил один из атрибутов из класса.Новые записи в этой таблице показывают значение <none> для удаленного атрибута.Но есть ли способ, которым я могу полностью отбросить этот столбец со стола?

Спасибо.

Добавлен следующий код «миграции» в соответствии с предложением Мораса, но он не дает желаемого результата:

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 ]

7 голосов
/ 27 февраля 2013

Если вы используете 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)
6 голосов
/ 12 марта 2012

Я нашел ответ на эту проблему в этой статье: http://code.google.com/appengine/articles/update_schema.html

" Удаление удаленных свойств из хранилища данных

Если вы удалили свойство из вашей модели, вы обнаружите, что у существующих объектов все еще есть свойство. Оно все равно будет отображаться в консоли администратора и по-прежнему будет присутствовать в хранилище данных. Чтобы действительно очистить старые данные, вам нужно циклически перебрать свои объекты и удалить данные изкаждый.

  • Убедитесь, что вы удалили свойства из определения модели.

  • Если ваш класс модели наследуется от db.Model, временнопереключите его на наследование от db.Expando. (Экземпляры db.Model не могут быть изменены динамически, что мы и должны сделать на следующем шаге.)

  • Цикл по существующим сущностям(как описано выше). Для каждой сущности используйте delattr , чтобы удалить устаревшее свойство, а затем сохраните сущность.

  • Если ваша модель изначально унаследовала from db.Model, не забудьте поменять его обратно после обновления всех данных. "

А вот пример с кодом: http://sandrylogan.wordpress.com/2010/12/08/delattr/

5 голосов
/ 16 мая 2011

В хранилище данных нет понятия "таблица".Каждый объект может иметь произвольные свойства, которые не соответствуют общей схеме.Единственная «схема» находится в коде вашей модели, и существующие записи не изменяются автоматически при изменении ваших моделей.

Итак, чтобы удалить свойство из существующих записей, вам нужно выполнить итерацию по всем записям-сохранить их без собственности.

3 голосов
/ 17 мая 2011

Средство просмотра хранилища данных получает свой список столбцов из статистики хранилища данных, которые регулярно обновляются.Если вы удалили этот столбец из каждой сущности, в которой он был, подождите день или два, и средство просмотра хранилища данных перестанет его отображать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...