Я использую библиотеку массовых обновлений Ника Джонсона в google appengine (http://blog.notdot.net/2010/03/Announcing-a-robust-datastore-bulk-update- утилита для App-Engine). Он прекрасно работает для других задач, но по какой-то причине со следующим кодом:
from google.appengine.ext import db
from myapp.main.models import Story, Comment
import bulkupdate
class Migrate(bulkupdate.BulkUpdater):
DELETE_COMPLETED_JOBS_DELAY = 0
DELETE_FAILED_JOBS = False
PUT_BATCH_SIZE = 1
DELETE_BATCH_SIZE = 1
MAX_EXECUTION_TIME = 10
def get_query(self):
return Story.all().filter("hidden", False).filter("visible", True)
def handle_entity(self, entity):
comments = entity.comment_set
for comment in comments:
s = Story()
s.parent_story = comment.story
s.user = comment.user
s.text = comment.text
s.submitted = comment.submitted
self.put(s)
job = Migrate()
job.start()
Я получаю следующую ошибку в моих журналах:
Permanent failure attempting to execute task
Traceback (most recent call last):
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 258, in post
run(self.request.body)
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 122, in run
raise PermanentTaskFailure(e)
PermanentTaskFailure: 'module' object has no attribute 'Migrate'
Мне это кажется довольно странным. Очевидно, что этот класс находится прямо над заданием, они находятся в одном файле, и очевидно, что вызывается job.start. Почему он не видит мой класс Migrate?
EDIT: Я добавил это задание обновления в более новую версию кода, которая не используется по умолчанию. Я вызываю задание с правильным URL-адресом (http://version.myapp.appspot.com/migrate). Возможно ли, что это связано с тем, что это не версия «по умолчанию», которую обслуживает App Engine?