Загрузка коллекций может быть сделана
food.getIngredients().size()
, food.getIngredients().isEmpty()
или других методов. Я предполагаю, что некоторый код обращается к коллекции, и это вызывает ее.
Из django doc:
SQLite предназначен для облегчения базы данных и, следовательно, не может поддерживать высокий уровень параллелизма. OperationalError: база данных заблокирована ошибки указывают на то, что ваше приложение испытывает больше параллелизма, чем sqlite может обрабатывать по умолчанию конфигурация. Эта ошибка означает, что один поток или процесс имеет эксклюзивный заблокировать соединение с базой данных и истекло время ожидания другого потока замок будет выпущен.
Оболочка Python SQLite по умолчанию значение тайм-аута, определяющее, как долго второй поток может ждать на замке до истечения времени ожидания и вызывает OperationalError: database заблокирована ошибка.
Если вы получаете эту ошибку, вы можете решить эту проблему:
Переключение на другую базу данных. В определенный момент SQLite становится слишком "lite" для реальных приложений, и такого рода ошибки параллелизма укажите, что вы достигли этой точки.
Переписать код, чтобы уменьшить параллелизм и убедитесь, что база данных сделки недолговечны.
Увеличить значение тайм-аута по умолчанию на установка параметра базы данных тайм-аута optionoption
http://docs.djangoproject.com/en/dev/ref/databases/#database-is-locked-errorsoption
У меня есть та же ошибка! Одной из причин было соединение с БД, не был закрыт. Поэтому проверьте на открытые соединения с БД . Кроме того, проверьте, имеете ли Вы , фиксировал DB прежде, чем закрыть соединение.
Я встретился с этим сообщением об ошибке в ситуации, которая (ясно) не обращена информацией о справке, связанной в ответе patrick.
, Когда я использовал transaction.atomic()
для обертывания вызова к FooModel.objects.get_or_create()
и назвал тот код одновременно от двух различных потоков, только один поток успешно выполнится, в то время как другой добрался бы, "база данных заблокирована" ошибка. Изменение параметра базы данных тайм-аута не имело никакого эффекта на поведение.
я думаю, что это - то, вследствие того, что sqlite не может обработать несколько одновременных устройств записи , таким образом, приложение должно сериализировать записи самостоятельно.
я решил проблему при помощи threading.RLock
объект вместо transaction.atomic()
, когда мое приложение Django работает с sqlite бэкендом. Это не совсем эквивалентно, таким образом, Вы, возможно, должны сделать что-то еще в своем приложении.
Вот мой код, который работает FooModel.objects.get_or_create
одновременно от двух различных потоков, в случае, если это полезно:
from concurrent.futures import ThreadPoolExecutor
import configurations
configurations.setup()
from django.db import transaction
from submissions.models import ExerciseCollectionSubmission
def makeSubmission(user_id):
try:
with transaction.atomic():
e, _ = ExerciseCollectionSubmission.objects.get_or_create(
student_id=user_id, exercise_collection_id=172)
except Exception as e:
return f'failed: {e}'
e.delete()
return 'success'
futures = []
with ThreadPoolExecutor(max_workers=2) as executor:
futures.append(executor.submit(makeSubmission, 296))
futures.append(executor.submit(makeSubmission, 297))
for future in futures:
print(future.result())