2011-01-22 22 views
9

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?

Respuesta

7

Parece probable que su declaración de la clase 'Migrar' esté en la secuencia de comandos del controlador (por ejemplo, la invocada directamente por app.yaml). Una limitación de diferido es que no puede usarlo para llamar a funciones definidas en el módulo manejador.

A propósito, mi biblioteca de actualizaciones masivas está en desuso en favor del soporte mapreduce de App Engine; probablemente deberías usar eso en su lugar.

+0

Perfecto, exactamente lo que necesitaba. Debo haberme perdido esto en algún lugar a lo largo de la línea. Gracias. –

+1

Wow. ¿Está esa limitación del diferido documentada en algún lugar? Si es así, ¡lo extrañé completamente! – allyourcode

+1

@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. –

Cuestiones relacionadas