2012-04-14 9 views
0

Я знаю, что все мои данные очищаются по умолчанию каждый раз, когда я перезапускаю сервер разработки в Google App Engine, но мне нужно знать, что при запуске развертывания я могу программным способом удалять не только объекты всех видов, но также сами объекты Kind, поскольку я меняю их во время циклов разработки/развертывания.Как удалить объект Kind, сам в Google App Engine?

Глядя на подобные вопросы, я придумал эту попытку:

from model import * 
from google.appengine.ext.db import * 
from google.appengine.ext.db.metadata import * 

for i in Kind.all(): 
    if i.kind_name == 'Person': 
     i.delete() # Try one way 
     db.delete(i) # Try another way 
     print "Yes" 
     break 

... но это печатает «Да» каждый раз, указывая, что «лицо» вид не удаляется. Это просто артефакт сервера разработки, или вы никогда не можете удалить объекты Kind?

ответ

3

Вы не можете удалить Вид, возвращаемый запросом метаданных. У хранилища данных App Engine есть динамическая схема, которая автоматически адаптируется при удалении последнего объекта. Возможно, что у Dev appserver есть некоторое отставание здесь - или, возможно, вы ошибаетесь, что Datastore удаляется каждый раз, поскольку это не должно произойти. Почему вы думаете, что это так?

PS. Не используйте import * так много, это делает ваш код труднее читать и может вызвать ошибки из-за конфликтов имен ...

+0

Ну, это не лаг, потому что я запускаю этот код вручную в интерактивной консоли (которая также почему я принимаю ярлык импорта *), и не имеет значения, как долго я жду. – tamboril

+0

Я также обнаружил, что dev_appserver.py при использовании datastore_file_stub (по умолчанию) никогда не записывает файл pickle. Вот почему он очищается каждый раз. – tamboril

+0

FYI, я только что обнаружил, что проблема Dev-сервера приложений, не записывающего файл, связана с ошибкой в ​​пользовательском интерфейсе Launcher. Когда он останавливает сервер приложений, он посылает ему тяжелое убийство. Попробуйте запустить dev appserver из командной строки и остановите его с помощью^C, после чего он сохранит. Чтобы удалить все объекты, сделайте запрос только ключей и вызовите db.delete() в списке ключей партиями по 100 или около того. –

Смежные вопросы