2013-06-04 2 views
0

Я использую сельдерей с джанго, но не модуль django-celery.Странные ошибки БД в сельдерее

Я получаю очень странные ошибки базы данных. Они происходят каждый раз, но меняются. Вот некоторые примеры:

  • ProgrammingError ('нет результатов, чтобы загрузить',)
  • TransactionManagementError: Сделка управляемого блока закончилась в ожидании COMMIT/ROLLBACK
  • IntegrityError: вставка или обновление таблицы "myapp_mymodel" нарушает иностранные ключевое ограничение «myapp_mymodel2_mymodel_id_fkey»: ДЕТАЛЬ: Ключ (mymodel_id) = (10082) отсутствует в таблице «myapp_mymodel».
  • MaybeEncodingError: Ошибка отправки результата: '""'. Причина: '' PicklingError ("Can \ 't pickle: поиск атрибута myapp.models.DoesNotExist не удалось",)' '.

Код работает нормально, если я его называю прямым (без сельдерея).

ответ

0

Сельдерей начинает рабочие процессы с помощью fork(). Если вы что-то делаете в celeryconfig.py (или в модуле tasks.py), который использует соединение базы данных django во время импорта, вам необходимо перезагрузить соединение с базой данных.

Но лучшим решением является: Не используйте соединение с базой данных при импорте (на уровне модуля или класса).

Вы можете использовать этот небольшой скрипт, чтобы увидеть, если что-то глубоко в стек импорта действительно использует базу данных:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from django.db.backends import BaseDatabaseWrapper 
def raise_exception(self): 
    raise Exception('Do not execute SQL during importing Python code!') 

BaseDatabaseWrapper.cursor=raise_exception 

import celeryconfig 
for module in celeryconfig.CELERY_IMPORTS: 
    __import__(module) 
Смежные вопросы