Сельдерей в докку не видит записи sqlite

Мой стек: Django, Celery (брокер Redis), Dokku.

Мой код поместил запись в базу данных sqlite и поставил задачу для Celery:

package = Package.objects.get(pk=package_id)
package.download_status = 'QUEUE' # package is Django ORM object
package.save()

task_download_package.delay(package.id)  # put a task to redis for celery

Теперь мне нужно получить этот объект из базы данных sqlite внутри задачи Celery. Но внутри процесса задачи Celery я не вижу записи:

@app.task(bind=True)
def task_download_package(self,
                          package_id: int):
    try:
        package = Package.objects.get(pk=package_id)
    except ObjectDoesNotExist:
        print("Package with pk={} not found".format(package_id))  # I HAVE GOT THIS MESSAGE
        return

Но когда я запрашиваю package.download_status у процесса Django с помощью моей специальной конечной точки, я получаю статус QUEUE. Похоже, что процессы Django и Celery имеют разные контейнеры или разные базы данных. Я проверил connection.settings_dict['NAME'] и возвращает одно и то же значение /app/db.sqlite3 для процессов Django и Celery.

Этот код без Dokku работает нормально, но теперь он мне нужен с Dokku. Почему Celery не видит записи в sqlite db? Действительно ли это одна и та же база данных? Может быть, мне нужно что-то вроде Commit? (Я использую метод сохранения Django) Как я могу это исправить?


person InkscapeQ    schedule 19.07.2020    source источник
comment
Похоже, что процессы Django и Celery имеют разные контейнеры или разные базы данных — это очень вероятно. Я знаю, что именно так это работает на Heroku, который вдохновил Dokku. SQLite — плохой выбор базы данных для современного контейнерного хостинга. Вместо этого используйте подходящую клиент-серверную базу данных, такую ​​как PostgreSQL.   -  person Chris    schedule 19.07.2020
comment
Используете ли вы транзакции для сохранения данных в базе данных?   -  person hendrikschneider    schedule 19.07.2020
comment
Нет, я не использую транзакции для sqlite.   -  person InkscapeQ    schedule 20.07.2020


Ответы (1)


Я решил проблему, поделившись файлом db.sqlite3 в общем каталоге на хост-компьютере Dokku. И указать путь в настройках приложения:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/home/my_user/my_company/my_app/database/db.sqlite3',
    }
}

И поделитесь этим каталогом для контейнера приложений:

dokku storage:mount my_app /home/my_user/my_company/my_app/database/:/home/my_user/my_company/my_app/database/
person InkscapeQ    schedule 20.07.2020