Browse Source

SQLAlchemy Backend: Auto add TaskMeta.date_done + auto create if task_id
doesn't exist.

Ask Solem 15 years ago
parent
commit
4255450b1c
3 changed files with 11 additions and 7 deletions
  1. 8 5
      celery/backends/database.py
  2. 2 2
      celery/db/models.py
  3. 1 0
      contrib/requirements/default.txt

+ 8 - 5
celery/backends/database.py

@@ -17,7 +17,7 @@ raw_cs = "DRIVER={FreeTDS};SERVER=%s;PORT=%d;DATABASE=%s;UID=%s;PWD=%s;CHARSET=U
 #connection_string = "mssql:///?odbc_connect=%s" % urllib.quote_plus(raw_cs)
 #connection_string = 'sqlite:////mnt/winctmp/celery.db'
 connection_string = 'sqlite:///celery.db'
-engine = create_engine(connection_string, echo=True)
+engine = create_engine(connection_string)
 Session = sessionmaker(bind=engine)
 
 
@@ -30,10 +30,13 @@ class DatabaseBackend(BaseDictBackend):
         try:
             tasks = session.query(Task).filter(Task.task_id == task_id).all()
             if not tasks:
-                raise RuntimeError('Task with task_id: %s not found' % task_id)
-            tasks[0].result = result
-            tasks[0].status = status
-            tasks[0].traceback = traceback
+                task = Task(task_id)
+                session.add(task)
+            else:
+                task = tasks[0]
+            task.result = result
+            task.status = status
+            task.traceback = traceback
             session.commit()
         finally:
             session.close()

+ 2 - 2
celery/db/models.py

@@ -18,7 +18,7 @@ class Task(ModelBase):
     task_id = Column("task_id", String(255), primary_key=True)
     status = Column("status", String(50), default=states.PENDING)
     result = Column("result", PickleType, nullable=True)
-    date_done = Column("date_done", DateTime,
+    date_done = Column("date_done", DateTime, default=datetime.now,
                        onupdate=datetime.now, nullable=True)
     traceback = Column("traceback", Text, nullable=True)
 
@@ -50,7 +50,7 @@ class TaskSet(ModelBase):
                 primary_key=True)
     taskset_id = Column("taskset_id", String(255), unique=True)
     result = Column("result", PickleType, nullable=True)
-    date_done = Column("date_done", DateTime,
+    date_done = Column("date_done", DateTime, default=datetime.now,
                        onupdate=datetime.now, nullable=True)
 
     def __init__(self, task_id):

+ 1 - 0
contrib/requirements/default.txt

@@ -1,5 +1,6 @@
 mailer
 python-dateutil
+sqlalchemy
 anyjson
 carrot>=0.10.4
 django-picklefield