Tôi đã sử dụng cần tây với MySQL
. Tôi muốn lưu trữ id tác vụ dưới dạng số nguyên đơn giản trong cơ sở dữ liệu hoặc trong một biến cần tây task
. Làm thế nào tôi có thể làm điều đó?Lưu trữ id tác vụ cho mỗi tác vụ cần tây trong cơ sở dữ liệu
Trả lời
Tại sao không tạo mô hình nhiệm vụ cần tây và lưu id tác vụ cần tây cho mô hình đó?
class CeleryModel(models.Model):
celery_task_id = models.CharField(max_length = 50, unique=True)
Sau đó:
def some_celery_task():
result = celery_task.delay()
celery_task = CeleryModel(celery_task_id = result.id)
celery_task.save() # added save line
giá trị số nguyên của bạn sau đó sẽ là: celery_task.id
để tương ứng với thực tế, celery_task_id độc đáo.
CẬP NHẬT: một cách khác ...
Đầu tiên python manage.py inspectdb > inspectdb.py
. Bên trong tệp đó, bạn sẽ tìm thấy:
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'
Tiếp theo, python manage.py startapp celery_model
. Đặt tệp này trong tệp models.py. Tôi sử dụng phía nam, vì vậy bước cuối cùng của tôi sẽ là python manage.py convert_app celery_model
. Tuy nhiên, nó không cần thiết. Bây giờ bạn có quyền truy cập cấp độ django để celery này datatable, và có thể đọc khóa chính cho mỗi nhiệm vụ như giá trị số nguyên của bạn. Ví dụ
>>> 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
Có người thông minh sẽ biết làm thế nào để làm cho CeleryTaskmeta
một mô hình chỉ đọc của bạn bởi vì tôi không nghĩ rằng bạn sẽ muốn làm xáo trộn các DataTable.
UPDATE: đến phần cuối của câu hỏi của bạn:
>>> 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>
Để có được ID nhiệm vụ cần tây khi nhiệm vụ được bắt đầu tôi làm như sau:
process_task = my_task.apply_async(args=[args])
task_id = process_task.task_id
nơi my_task là một phương pháp trong tasks.py
Cảm ơn bạn đã giải thích kỹ lưỡng và rõ ràng! – pynovice
Làm phiền vấn đề là tôi muốn truy xuất task_id khi quá trình bắt đầu. Nó chỉ ra dữ liệu được viết trong bảng CeleryTaskMeta chỉ sau khi công việc hoàn tất thành công. – pynovice
@Cole làm thế nào để bạn lưu trữ kết quả từ một phế liệu không đồng bộ trong cơ sở dữ liệu? – losee