Почему Model.add (Model.get ()) блокирует «базу данных» Ошибка в Django? [Дубликат]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

Это простой синхронный вызов функции (где каждая строка кода выполняется одна за другой в последовательность), и результат будет таким же, как ожидалось.

Теперь добавим немного завихрения, введя небольшую задержку в нашей функции, чтобы все строки кода не выполнялись последовательно. Таким образом, он будет эмулировать асинхронное поведение функции:

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

Таким образом, резюме - для решения асинхронных функций, таких как вызовы на основе ajax и т. д., вы можете использовать обещание resolve значение (которое вы намерены вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.

27
задан Pokechu22 25 October 2014 в 02:26
поделиться

4 ответа

Из django doc:

SQLite предназначен как легкая база данных и, следовательно, не может поддерживать высокий уровень параллелизма. Ошибки OperationalError: ошибки в базе данных указывают на то, что ваше приложение испытывает больше параллелизма, чем sqlite может обрабатывать по умолчанию. Эта ошибка означает, что один поток или процесс имеет исключительную блокировку соединения с базой данных, а другой поток истекает, ожидая освобождения блокировки.

Оболочка SQLite Python имеет значение тайм-аута по умолчанию, которое определяет, как долго второй потоку разрешено дождаться блокировки до того, как он истечет, и вызывает ошибку OperationalError: database заблокирована.

Если вы получаете эту ошибку, вы можете ее решить:

Переход на другой сервер базы данных. В какой-то момент SQLite становится слишком «легким» для реальных приложений, и эти разновидности ошибок параллелизма указывают на то, что вы достигли этой точки.

Перезаписывание кода для уменьшения параллелизма и обеспечения коротких транзакций базы данных -lived.

Увеличьте значение таймаута по умолчанию, установив параметр базы данных таймаута optionoption

http://docs.djangoproject.com/en/dev/ исх / базы данных / # базы данных является автоподстройки errorsoption

47
ответ дан patrick 3 September 2018 в 15:29
поделиться

В моем случае, это потому, что я открываю базу данных из SQLite Browser. Когда я закрываю его из браузера, проблема исчезла.

7
ответ дан Aminah Nuraini 3 September 2018 в 15:29
поделиться

попробуйте выполнить эту команду:

sudo fuser -k 8000/tcp
-3
ответ дан cz game 3 September 2018 в 15:29
поделиться

Практическая причина этого часто заключается в том, что оболочки python или django открыли запрос в БД и не были закрыты должным образом; убийство вашего доступа к терминалу часто освобождает его. У меня была эта ошибка при запуске тестов командной строки.

Редактировать: Я получаю периодические upvotes на этом. Если вы хотите убить доступ без перезагрузки терминала, то из командной строки вы можете:

from django import db
db.connections.close_all()
17
ответ дан Withnail 3 September 2018 в 15:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: