Estoy usando la biblioteca Bulk Update de Nick Johnson en google appengine (http://blog.notdot.net/2010/03/Announcing-a-robust-datastore- bulk-update-utility-for-App-Engine). Funciona de maravilla para otras tareas, pero por alguna razón con el siguiente código:PermanentTaskFailure: el objeto 'module' no tiene ningún atributo 'Migrate'
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()
me sale el siguiente error en los registros de mi:
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'
Parece bastante extraño para mí. Claramente, esa clase está justo arriba del trabajo, están en el mismo archivo y claramente el trabajo. Se está llamando al inicio. ¿Por qué no puede ver mi clase Migrate?
EDIT: Agregué esta tarea de actualización en una versión más nueva del código, que no es la predeterminada. Invoco el trabajo con la URL correcta (http://version.myapp.appspot.com/migrate). ¿Es posible que esto esté relacionado con el hecho de que no es la versión 'predeterminada' que ofrece App Engine?
Perfecto, exactamente lo que necesitaba. Debo haberme perdido esto en algún lugar a lo largo de la línea. Gracias. –
Wow. ¿Está esa limitación del diferido documentada en algún lugar? Si es así, ¡lo extrañé completamente! – allyourcode
@allyourcode Está en docstring, y creo que está en el artículo. El problema surge porque la secuencia de comandos principal tiene un '__name__' de' __main__' cuando se llama como un controlador, que no coincide con su nombre habitual. –