tutorial - sqlite3 python install
Python SQLite: la base de datos está bloqueada (16)
Estoy intentando este código:
import sqlite
connection = sqlite.connect(''cache.db'')
cur = connection.cursor()
cur.execute(''''''create table item
(id integer primary key, itemno text unique,
scancode text, descr text, price real)'''''')
connection.commit()
cur.close()
Estoy atrapando esta excepción:
Traceback (most recent call last):
File "cache_storage.py", line 7, in <module>
scancode text, descr text, price real)'''''')
File "/usr/lib/python2.6/dist-packages/sqlite/main.py", line 237, in execute
self.con._begin()
File "/usr/lib/python2.6/dist-packages/sqlite/main.py", line 503, in _begin
self.db.execute("BEGIN")
_sqlite.OperationalError: database is locked
Los permisos para cache.db son correctos. ¿Algunas ideas?
- Su
cache.db
está siendo usado actualmente por otro proceso. - Detenga ese proceso y vuelva a intentarlo, debería funcionar.
Aquí hay una buena solución para el acceso simultáneo:
while True:
connection = sqlite3.connect(''user.db'', timeout=1)
cursor = connection.cursor()
try:
cursor.execute("SELECT * FROM queue;")
result = cursor.fetchall()
except sqlite3.OperationalError:
print("database locked")
num_users = len(result)
# ...
Debería verificar si no hay una plataforma de administración y desarrollo de DBMS trabajando en su base de datos (como pgAdmin), ya que esta es probablemente la causa más común de este error. Si existe, confirma los cambios realizados y el problema ya no existe.
Debido a que este sigue siendo el principal éxito de Google para este problema, permítanme agregar una posible causa. Si está editando la estructura de su base de datos y no ha confirmado los cambios, la base de datos quedará bloqueada hasta que confirme o revierte.
(Probablemente poco común, pero estoy desarrollando una aplicación para que el código y la base de datos se desarrollen al mismo tiempo)
En Linux puede hacer algo similar, por ejemplo, si su archivo bloqueado es development.db:
$ fuser development.db Este comando mostrará qué proceso está bloqueando el archivo:
development.db: 5430 Solo mate el proceso ...
kill -9 5430 ... Y tu base de datos se desbloqueará.
Establezca el parámetro de tiempo de espera en su llamada de conexión, como en:
connection = sqlite.connect(''cache.db'', timeout=10)
La base de datos está bloqueada por otro proceso que le está escribiendo. Tienes que esperar hasta que la otra transacción se haya comprometido. Ver la documentación de connect ()
La razón por la que el mío mostraba el mensaje de "Bloqueo" se debía a que había abierto un IDE de SQLite3 en mi mac y esa era la razón por la que estaba bloqueado. Supongo que estaba jugando con el DB dentro del IDE y no había guardado los cambios y por lo tanto se colocó un bloqueo.
En pocas palabras, compruebe que no haya cambios no guardados en la base de datos y que no se estén utilizando en otro lugar.
Oh, su rastreo lo delató: tiene un conflicto de versiones. Ha instalado una versión anterior de sqlite en su directorio dist-packages local cuando ya tiene sqlite3 incluido en su distribución python2.6 y no necesita y probablemente no pueda usar la versión anterior de sqlite. Primer intento:
$ python -c "import sqlite3"
y si eso no le da un error, desinstale su paquete de dest . :
easy_install -mxN sqlite
y luego import sqlite3
en tu código y diviértete.
Resultó que el problema sucedió porque la ruta al archivo db era en realidad un directorio montado de samba. Lo moví y eso comenzó a funcionar.
Sé que esto es viejo, pero sigo teniendo el problema y este es el primer enlace en Google para eso. OP dijo que su problema era que el .db tenía una cuota de SMB, que era exactamente mi situación. La investigación de mis diez minutos indica que se trata de un conflicto conocido entre sqlite3 y smb; Encontré informes de errores que datan de 2007.
Lo resolví agregando la opción "nobrl" a mi línea de montaje smb en / etc / fstab , por lo que ahora la línea se ve así:
//SERVER/share /mnt/point cifs credentials=/path/to/.creds,sec=ntlm,nobrl 0 0
Esta opción evita que su cliente SMB envíe bloqueos de rango de bytes al servidor. No estoy muy al tanto sobre los detalles de mi protocolo SMB, pero lo mejor que puedo decir es que esta configuración sería mayormente preocupante en un entorno multiusuario, donde alguien más podría estar intentando escribir en la misma base de datos que usted. Para una configuración doméstica, al menos, creo que es lo suficientemente seguro.
Mis versiones relevantes:
- Casa de la Moneda 17.1 Rebecca
- SMB v4.1.6-Ubuntu
- Python v3.4.0
- SQLite v3.8.2
- El recurso compartido de red está alojado en un servidor Win12R2
Supongo que realmente está usando sqlite3 aunque su código indique lo contrario. Aquí hay algunas cosas para verificar:
- Que no tiene un proceso colgado sobre el archivo (unix:
$ fuser cache.db
debería decir nada) - No hay un archivo cache.db-journal en el directorio con cache.db; esto indicaría una sesión bloqueada que no se ha limpiado correctamente.
- Pida al shell de la base de datos que se compruebe a sí mismo:
$ sqlite3 cache.db "pragma integrity_check;"
-
$ sqlite3 cache.db ".backup cache.db.bak"
copia de seguridad de la base$ sqlite3 cache.db ".backup cache.db.bak"
datos$ sqlite3 cache.db ".backup cache.db.bak"
- Elimina cache.db ya que probablemente no tengas nada (si acabas de aprender) y prueba tu código nuevamente
- Vea si la copia de seguridad funciona
$ sqlite3 cache.db.bak ".schema"
En su defecto, lea las cosas que pueden salir mal y cómo dañar los archivos de su base de datos
Tuve el mismo problema: sqlite3.IntegrityError
Como se menciona en muchas respuestas, el problema es que una conexión no se ha cerrado correctamente.
En mi caso, lo try
except
bloques. Estaba accediendo a la base de datos en el bloque try
y cuando se produjo una excepción, quería hacer algo más en el bloque except
.
try:
conn = sqlite3.connect(path)
cur = conn.cursor()
cur.execute(''''''INSERT INTO ...'''''')
except:
conn = sqlite3.connect(path)
cur = conn.cursor()
cur.execute(''''''DELETE FROM ...'''''')
cur.execute(''''''INSERT INTO ...'''''')
Sin embargo, cuando se produjo la excepción, la conexión del bloque try
no se había cerrado .
Lo resolví usando declaraciones dentro de los bloques.
try:
with sqlite3.connect(path) as conn:
cur = conn.cursor()
cur.execute(''''''INSERT INTO ...'''''')
except:
with sqlite3.connect(path) as conn:
cur = conn.cursor()
cur.execute(''''''DELETE FROM ...'''''')
cur.execute(''''''INSERT INTO ...'''''')
Tuve este problema mientras trabajaba con Pycharm y con una base de datos que otro usuario me había proporcionado originalmente. Entonces, así es como lo resuelvo en mi caso: 1. Cerré todas las pestañas en Pycharm que operan con la base de datos problemática. 2. Detenga todos los procesos en ejecución desde el botón cuadrado rojo en la esquina superior derecha de Pycharm. 3. Elimine la base de datos problemática del directorio. 4. Cargue nuevamente la base de datos original. Y funcionó de nuevo.
Una razón posible para bloquear la base de datos que encontré con SQLite es cuando intenté acceder a una fila escrita por una aplicación y leída por otra al mismo tiempo. Es posible que desee establecer un tiempo de espera ocupado en su contenedor SQLite que girará y esperará a que la base de datos se vuelva libre (en la API original de c ++ la función es sqlite3_busy_timeout ). Descubrí que 300ms era suficiente en la mayoría de los casos.
Pero dudo que este sea el problema, en función de su publicación. Pruebe otras recomendaciones primero.
Yo también tuve este problema. Intentaba ingresar datos en la base de datos sin guardar los cambios que había realizado en ella. después de que guardé los cambios trabajados