Проблема Django и Sqlite Concurrency - PullRequest
4 голосов
/ 21 февраля 2009

Я немного читал о проблемах параллелизма с sqlite, но я не понимаю, как они применимы к Django, так как он по своей сути однопоточный. Я также не использую никаких многопроцессорных модулей. У меня нет абсолютно никакого опыта в параллельном программировании, поэтому, если кто-то может определить, ПОЧЕМУ следующий код вызывает OperationalError: «база данных заблокирована», я был бы благодарен.

views.py

def screening(request, ovramt=None):
errors = []
if request.method == "POST":
    form = ScreeningForm(request.POST)
    if form.is_valid():
       print "Woo valid!!"
    return HttpResponse()

else: # GET            
    if ovramt is None:
        o = Ovramt.objects.select_related(depth=1).latest("date_completed")
        print "found?"
        print o.id
    else:
        try:
            o = Ovramt.objects.select_related(depth=1).get(id=ovramt)
        except:
            errors.append("OVRAMT NOT FOUND") 


    if o.residents.count() <= 0:
        o.add_active_residents()
    residents = list(o.residents)

models.py

def add_active_residents(self):
    ssa_res = SSA_Resident.objects.select_related(depth=1).filter(ssa=self.ssa, active=True)
    for r in ssa_res:
        self.residents.add(r.resident) # Fails Here
    self.save()

Метод add_active_residents работает нормально, пока он не вызывается из модуля views. Есть ли открытое соединение с базой данных, открытой в представлении, которое препятствует записи из модели? У кого-нибудь есть объяснение, почему этот код выдаст ошибку?

Ответы [ 4 ]

4 голосов
/ 21 февраля 2009

В следующем методе функция

def add_active_residents(self):
    ssa_res = SSA_Resident.objects.select_related(depth=1).filter(ssa=self.ssa, active=True)
    for r in ssa_res:
        self.residents.add(r.resident) # Fails Here
    self.save()

Почему существует select_related? Вам действительно нужны ФК из ssa_res предметов. Зачем нужны дополнительные запросы для связанных предметов?

2 голосов
/ 22 февраля 2009

Насколько я понимаю, только операции записи приведут к состоянию блокировки по дБ. http://www.sqlite.org/lockingv3.html

Трудно сказать, в чем проблема, не зная, как django обрабатывает sqlite внутри.

Говоря об использовании sqlite со стандартным cgi, я заметил, что в некоторых случаях снятие блокировки может занять много времени. Вы можете увеличить значение тайм-аута, упомянутое Мэтью Кристенсеном.

2 голосов
/ 21 февраля 2009

Вы используете Python 2.6?

Если это так, это (очевидно) известная проблема, которую можно устранить, добавив:

DATABASE_OPTIONS = {'timeout': 30}

на ваши settings.py

См. http://code.djangoproject.com/ticket/9409

1 голос
/ 21 февраля 2009

Звучит так, будто вы на самом деле запускаете многопоточное приложение, несмотря на то, что вы говорите. Я немного невежественен в отношении Django, но я предполагаю, что даже если он может быть однопоточным, любой сервер отладки или производственный сервер, на котором вы запускаете свое приложение, не будет «по своей сути однопоточным».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...