#django #celery #django-orm #celerybeat
Вопрос:
Я настроил celery и celery beat в Django, и они работают правильно, за исключением одной проблемы,
Когда celery beat берет мою задачу и передает ее работнику сельдерея, мой запрос внутри задачи не дает результата, но когда я проверяю его сам, он дает результаты, ниже приведена моя задача:
@shared_task
def remove_expired_pending_task():
call_command("remove_pending")
а ниже приведен метод дескриптора команды «remove_pending» :
def handle(self, *args, **options):
try:
aware = pytz.timezone("Asia/Tehran")
min_date = aware.localize(jdatetime.datetime.now() - jdatetime.timedelta(hours=7))
max_date = aware.localize(jdatetime.datetime.now() jdatetime.timedelta(hours=7))
q = Payment.objects.filter(
is_completed=False,
date__range=(min_date, max_date)
)
c = q.count()
q.delete()
self.stdout.write(
f"{c} pending Payament deleted between
{min_date.strftime('%Y/%m/%d %H-%M-%S')} |
{max_date.strftime('%Y/%m/%d %H-%M-%S')}")
except Exception as exc:
self.stderr.write(
f"Exception happend in 'Remove pendings'n: {exc}")
и в celery.py файл после объявления приложения сельдерей я добавил это:
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(1000.0, remove_expired_pending_task.s(), name='remove_expired_pendings')
как я уже говорил, сельдерей находит и выполняет задачу, но запрос возвращает пустой набор запросов,
но когда я запускаю:
python manage.py remove_pending
ИЗМЕНИТЬ
конфигурацию базы данных-это:
DATABASES = {
"default": {
"ENGINE": os.environ.get("SQL_ENGINE", "django.db.backends.postgresql_psycopg2"),
"NAME": os.environ.get("SQL_DATABASE", "something"),
"USER": os.environ.get("SQL_USER", "something"),
"PASSWORD": os.environ.get("SQL_PASSWORD", "somethingpassword"),
"HOST": os.environ.get("SQL_HOST", "localhost"),
"PORT": os.environ.get("SQL_PORT", "5432"),
}
Это работает, и набор запросов не пуст, и они успешно удаляются.
вы знаете, почему это происходит?
Спасибо.
Комментарии:
1. Какова ваша конфигурация БД?
2. @IainShelvington привет, я добавил конфигурацию БД, о которой идет речь.
3. Возможно ли, что ваш процесс сельдерея имеет другие переменные среды и подключается к другой базе данных?
4. @IainShelvington о, хороший вопрос, я проверю его и сообщу вам о результате. Спасибо
5. @IainShelvington спасибо, сэр, вот и все, объект сельдерей был создан с настройками разработки, поэтому он использует базу данных разработки sqlite3, но Django использует производственные настройки и постгрейсы. еще раз спасибо