python - Error operacional: la base de datos está bloqueada
django database (5)
He realizado algunas operaciones repetitivas en mi aplicación (probándola), y de repente me aparece un error extraño:
OperationalError: database is locked
He reiniciado el servidor, pero el error persiste. ¿De qué se puede tratar?
Desde django doc:
SQLite está destinado a ser una base de datos liviana, y por lo tanto no puede soportar un alto nivel de concurrencia. Error operacional: la base de datos está bloqueada. Los errores indican que su aplicación está experimentando más concurrencia que la que puede manejar sqlite en la configuración predeterminada. Este error significa que un subproceso o proceso tiene un bloqueo exclusivo en la conexión de la base de datos y otro subproceso agotado en espera del bloqueo que se liberará.
El envoltorio SQLite de Python tiene un valor de tiempo de espera predeterminado que determina cuánto tiempo se le permite al segundo subproceso esperar en el bloqueo antes de que se agote el tiempo de espera y genera el error de base de datos OperationalError :.
Si está recibiendo este error, puede resolverlo mediante:
Cambiando a otra base de datos backend. En cierto punto, SQLite se vuelve demasiado "liviano" para las aplicaciones del mundo real, y este tipo de errores de concurrencia indican que ha llegado a ese punto.
Reescriba su código para reducir la concurrencia y asegurar que las transacciones de la base de datos sean de corta duración.
Aumente el valor de tiempo de espera predeterminado configurando la opción de opción de base de datos de tiempo de espera
http://docs.djangoproject.com/en/dev/ref/databases/#database-is-locked-errorsoption
En mi caso, fue porque abro la base de datos desde el navegador SQLite. Cuando lo cierro desde el navegador, el problema desaparece.
En mi caso, no había guardado una operación de base de datos que realicé dentro del navegador SQLite. Ahorrarlo solucionó el problema.
La razón práctica de esto es a menudo que las conchas de python o django han abierto una solicitud al DB y no se cerró correctamente; matar su acceso a la terminal a menudo lo libera. Tuve este error al ejecutar pruebas de línea de comandos hoy.
Edit: Tengo upvotes periódicos sobre esto. Si desea cancelar el acceso sin reiniciar el terminal, desde la línea de comandos puede hacer:
from django import db
db.connections.close_all()
intente este comando:
sudo fuser -k 8000/tcp