Наше приложение GAE создает локальную копию реляционной базы данных другого сайта в NDB. Существует 4 типа сущностей: пользователь, таблица, строка, поле. Каждый пользователь имеет кучу таблиц, каждая таблица имеет ряд строк, каждая строка содержит кучу полей.Проблема разбора хранилища GAE
SomeUser> SomeTable> Arow> Afield
Таким образом, каждый пользователь становится один объект группы. Мне нужна функция, где я могу очистить все таблицы (и их строки) для определенного пользователя. Каков правильный способ удаления всех таблиц и всех строк, при этом избегая ограничительного предела в ~ 5 операций в секунду.
Текущий код получает TransactionFailedError
из-за разногласий в группе Entity. (подробно, что я упускать из виду, что мы хотим, чтобы удалить таблицы с «сервис» атрибута установлено определенное значение)
def delete_tables_for_service(user, service):
tables = Tables.query(Tables.service == service, ancestor=user.key).fetch(keys_only=True)
for table in tables:
keys = []
keys += Fields.query(ancestor=table).fetch(keys_only=True)
keys += TableRows.query(ancestor=table).fetch(keys_only=True)
keys.append(table)
ndb.delete_multi(keys)
Похоже, что вы удаляете каждый объект таблицы (и связанные дочерние объекты) отдельно. Не видя контекста в вашем коде (и не знакомого с транзакциями на Python), я не могу определить, является ли это транзакцией для каждой таблицы. Вы пытались переместить свой 'ndb.delete_multi (keys)' вне цикла 'for', чтобы он удалял все таблицы? В противном случае, для пользователя с 10 таблицами, похоже, вы пытаетесь выполнить 10 транзакций. – tx802