2011-01-22 9 views
9

मैं Google appengine पर निक जॉनसन की थोक अपडेट लाइब्रेरी का उपयोग कर रहा हूं (http://blog.notdot.net/2010/03/Announcing-a-robust-datastore- थोक अद्यतन-उपयोगिता के लिए ऐप-इंजन)। यह अन्य कार्यों के लिए शानदार काम करता है, लेकिन निम्न कोड के साथ किसी कारण से:स्थायी टास्क विफलता: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है 'माइग्रेट'

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' 

यह मेरे लिए काफी विचित्र लगता है:

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() 

मैं अपने लॉग में निम्न त्रुटि मिलता है। जाहिर है कि कक्षा नौकरी से ऊपर है, वे एक ही फाइल में हैं और स्पष्ट रूप से नौकरी हैं। स्टार्ट कहा जा रहा है। यह मेरी माइग्रेट कक्षा क्यों नहीं देख सकता है?

संपादित करें: मैंने कोड के एक नए संस्करण में यह अद्यतन नौकरी जोड़ा, जो डिफ़ॉल्ट नहीं है। मैं सही यूआरएल (http://version.myapp.appspot.com/migrate) के साथ नौकरी का आह्वान करता हूं। क्या यह संभव है कि यह इस तथ्य से संबंधित है कि यह ऐप इंजन द्वारा प्रदत्त 'डिफ़ॉल्ट' संस्करण नहीं है?

उत्तर

7

ऐसा लगता है कि 'माइग्रेट' वर्ग की आपकी घोषणा हैंडलर स्क्रिप्ट में है (उदाहरण के लिए, जिसे सीधे app.yaml द्वारा बुलाया जाता है)। स्थगित करने की एक सीमा यह है कि आप हैंडलर मॉड्यूल में परिभाषित कार्यों को कॉल करने के लिए इसका उपयोग नहीं कर सकते हैं।

संयोग से, मेरी थोक अद्यतन लाइब्रेरी को ऐप इंजन के मैप्रिड समर्थन के पक्ष में बहिष्कृत किया गया है; आपको इसके बजाय शायद इसका उपयोग करना चाहिए।

+0

बिल्कुल सही, बिल्कुल मुझे जो चाहिए था। मुझे लाइन के साथ कहीं और याद आना चाहिए था। धन्यवाद। –

+1

वाह। क्या स्थगित दस्तावेज की सीमा कहीं भी है? यदि ऐसा है, तो मैं इसे पूरी तरह से याद किया! – allyourcode

+1

@allyourcode यह डॉकस्ट्रिंग में है, और मेरा मानना ​​है कि यह लेख में है। समस्या उत्पन्न होती है क्योंकि मुख्य स्क्रिप्ट में '__main__' का '__name__' होता है जिसे एक हैंडलर कहा जाता है, जो इसके सामान्य नाम से मेल नहीं खाता है। –

संबंधित मुद्दे