Skip to content

Commit

Permalink
Arithmetic Overflow Error with MSSQL Backend due to Integer 'id' Fiel…
Browse files Browse the repository at this point in the history
…d Limitation

and format black
Fixes celery#8634
  • Loading branch information
feiticeiro-tec committed Mar 22, 2024
1 parent d74222a commit c23dc9e
Showing 1 changed file with 52 additions and 34 deletions.
86 changes: 52 additions & 34 deletions celery/backends/database/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Database models used by the SQLAlchemy result store backend."""

from datetime import datetime, timezone

import sqlalchemy as sa
Expand All @@ -8,38 +9,46 @@

from .session import ResultModelBase

__all__ = ('Task', 'TaskExtended', 'TaskSet')
__all__ = ("Task", "TaskExtended", "TaskSet")


class Task(ResultModelBase):
"""Task result/status."""

__tablename__ = 'celery_taskmeta'
__table_args__ = {'sqlite_autoincrement': True}
__tablename__ = "celery_taskmeta"
__table_args__ = {"sqlite_autoincrement": True}

id = sa.Column(sa.Integer, sa.Sequence('task_id_sequence'),
primary_key=True, autoincrement=True)
id = sa.Column(
sa.Integer,
sa.Sequence("task_id_sequence", start=1, increment=1, minvalue=1, cycle=False),
primary_key=True,
autoincrement=True,
)
task_id = sa.Column(sa.String(155), unique=True)
status = sa.Column(sa.String(50), default=states.PENDING)
result = sa.Column(PickleType, nullable=True)
date_done = sa.Column(sa.DateTime, default=datetime.now(timezone.utc),
onupdate=datetime.now(timezone.utc), nullable=True)
date_done = sa.Column(
sa.DateTime,
default=datetime.now(timezone.utc),
onupdate=datetime.now(timezone.utc),
nullable=True,
)
traceback = sa.Column(sa.Text, nullable=True)

def __init__(self, task_id):
self.task_id = task_id

def to_dict(self):
return {
'task_id': self.task_id,
'status': self.status,
'result': self.result,
'traceback': self.traceback,
'date_done': self.date_done,
"task_id": self.task_id,
"status": self.status,
"result": self.result,
"traceback": self.traceback,
"date_done": self.date_done,
}

def __repr__(self):
return '<Task {0.task_id} state: {0.status}>'.format(self)
return "<Task {0.task_id} state: {0.status}>".format(self)

@classmethod
def configure(cls, schema=None, name=None):
Expand All @@ -51,8 +60,8 @@ def configure(cls, schema=None, name=None):
class TaskExtended(Task):
"""For the extend result."""

__tablename__ = 'celery_taskmeta'
__table_args__ = {'sqlite_autoincrement': True, 'extend_existing': True}
__tablename__ = "celery_taskmeta"
__table_args__ = {"sqlite_autoincrement": True, "extend_existing": True}

name = sa.Column(sa.String(155), nullable=True)
args = sa.Column(sa.LargeBinary, nullable=True)
Expand All @@ -63,43 +72,52 @@ class TaskExtended(Task):

def to_dict(self):
task_dict = super().to_dict()
task_dict.update({
'name': self.name,
'args': self.args,
'kwargs': self.kwargs,
'worker': self.worker,
'retries': self.retries,
'queue': self.queue,
})
task_dict.update(
{
"name": self.name,
"args": self.args,
"kwargs": self.kwargs,
"worker": self.worker,
"retries": self.retries,
"queue": self.queue,
}
)
return task_dict


class TaskSet(ResultModelBase):
"""TaskSet result."""

__tablename__ = 'celery_tasksetmeta'
__table_args__ = {'sqlite_autoincrement': True}

id = sa.Column(sa.Integer, sa.Sequence('taskset_id_sequence'),
autoincrement=True, primary_key=True)
__tablename__ = "celery_tasksetmeta"
__table_args__ = {"sqlite_autoincrement": True}

id = sa.Column(
sa.Integer,
sa.Sequence(
"taskset_id_sequence", start=1, increment=1, minvalue=1, cycle=False
),
autoincrement=True,
primary_key=True,
)
taskset_id = sa.Column(sa.String(155), unique=True)
result = sa.Column(PickleType, nullable=True)
date_done = sa.Column(sa.DateTime, default=datetime.now(timezone.utc),
nullable=True)
date_done = sa.Column(
sa.DateTime, default=datetime.now(timezone.utc), nullable=True
)

def __init__(self, taskset_id, result):
self.taskset_id = taskset_id
self.result = result

def to_dict(self):
return {
'taskset_id': self.taskset_id,
'result': self.result,
'date_done': self.date_done,
"taskset_id": self.taskset_id,
"result": self.result,
"date_done": self.date_done,
}

def __repr__(self):
return f'<TaskSet: {self.taskset_id}>'
return f"<TaskSet: {self.taskset_id}>"

@classmethod
def configure(cls, schema=None, name=None):
Expand Down

0 comments on commit c23dc9e

Please sign in to comment.