2013-03-04 6 views
6

मैंने MySQL के साथ अजवाइन का उपयोग किया है। मैं टास्क आईडी को डेटाबेस में एक सादे पूर्णांक के रूप में या सेलेरी task के चर के रूप में स्टोर करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?डेटाबेस में प्रत्येक सेलेरी कार्य के लिए एक कार्य आईडी संग्रहीत करना

उत्तर

12

क्यों एक सेलेरी कार्य मॉडल नहीं बनाते हैं, और उस मॉडल में एक सेलेरी कार्य आईडी सहेजते हैं?

class CeleryModel(models.Model): 
    celery_task_id = models.CharField(max_length = 50, unique=True) 

तब:

def some_celery_task(): 
    result = celery_task.delay() 
    celery_task = CeleryModel(celery_task_id = result.id) 
    celery_task.save() # added save line 

आपका पूर्णांक मान तो होगा: celery_task.id वास्तविक, अद्वितीय celery_task_id उसके तदनुरूप।

अद्यतन: एक और तरीका है ...

पहले python manage.py inspectdb > inspectdb.py। उस फ़ाइल के अंदर आप पाएंगे:

class CeleryTaskmeta(models.Model): 
    id = models.IntegerField(primary_key=True) 
    task_id = models.CharField(max_length=765, unique=True) 
    status = models.CharField(max_length=150) 
    result = models.TextField(blank=True) 
    date_done = models.DateTimeField() 
    traceback = models.TextField(blank=True) 
    hidden = models.IntegerField() 
    meta = models.TextField(blank=True) 
    class Meta: 
     db_table = u'celery_taskmeta' 

अगला, python manage.py startapp celery_model। इस फ़ाइल को models.py फ़ाइल में रखें। मैं दक्षिण का उपयोग करता हूं, इसलिए मेरा अंतिम चरण python manage.py convert_app celery_model होगा। हालांकि, यह अनावश्यक है। अब आपके पास इस सेलेरी डेटाटेबल तक django स्तर तक पहुंच है, और प्रत्येक कार्य के लिए प्राथमिक कुंजी को आपके पूर्णांक मान के रूप में पढ़ सकता है। उदा

>>> ct = CeleryTaskmeta.objects.get(id=1) 
>>> for k,v in ct.__dict__.items(): print k,v 
... 
status SUCCESS 
task_id 2fa95f24-7640-434c-9fef-0732ac1d23c7 
date_done 2013-02-17 19:22:56+00:00 
traceback None 
_state <django.db.models.base.ModelState object at 0x10263fa90> 
meta eJxrYKotZAzlSM7IzEkpSs0rZIotZC7WAwBREgb9 
result gAJLBC4= 
hidden 0 
id 1 

किसी चतुर पता होगा कि कैसे अपनी CeleryTaskmeta केवल पढ़ने के लिए मॉडल बनाने के लिए क्योंकि मुझे नहीं लगता कि आप datatable के साथ छेड़छाड़ करना चाहेंगे है।

अद्यतन: अपने प्रश्न के अंतिम भाग के लिए:

>>> from celerytest.tasks import add 
>>> result = add.delay() 
>>> result.int_id = 1 
>>> for k,v in result.__dict__.items(): print k,v 
... 
parent None 
app <Celery default:0x10264df10> 
task_name celerytest.tasks.add 
int_id 1 
id 01503afd-d196-47af-8e10-e7dc06603cfc 
backend <djcelery.backends.database.DatabaseBackend object at 0x1026842d0> 
+0

पूरी तरह से और साफ स्पष्टीकरण के लिए धन्यवाद! – pynovice

+1

समस्या यह है कि प्रक्रिया शुरू होने के बाद मैं task_id को पुनर्प्राप्त करना चाहता हूं। यह पता चला है कि नौकरी सफलतापूर्वक पूर्ण होने के बाद ही डेटा CeleryTaskMeta तालिका में लिखा गया है। – pynovice

+0

@Cole डेटाबेस में एसिंक्रोनस स्क्रैप से परिणाम कैसे संग्रहीत करते हैं? – losee

0

अजवाइन कार्य आईडी प्राप्त करने के लिए जब काम शुरू कर दिया है मैं निम्न कार्य करें:

process_task = my_task.apply_async(args=[args]) 
task_id = process_task.task_id 

जहां my_task भीतर एक विधि है functions.py

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