2009-10-07 15 views
6

Estoy trabajando en una máquina con Windows Vista en Python 3.1.1. Estoy tratando de insertar una gran cantidad de filas en un SQLite3 db. El archivo existe, y mi programa inserta correctamente algunas filas en el db. Sin embargo, en algún momento en el proceso de inserción, el programa muere con este mensaje: sqlite3.OperationalError: no se puede abrir archivo de base dePython sqlite3 "no se puede abrir el archivo de base de datos" en Windows

Sin embargo, antes de que muera, hay varias filas que se agregan a la base de datos correctamente.

Este es el código que se ocupa específicamente de la inserción:

idx = 0 
lst_to_ins = [] 
for addl_img in all_jpegs: 
    lst_to_ins.append((addl_img['col1'], addl_img['col2'])) 
    idx = idx + 1 
    if idx % 10 == 0: 
     logging.debug('adding rows [%s]', lst_to_ins) 
     conn.executemany(ins_sql, lst_to_ins) 
     conn.commit() 
     lst_to_ins = [] 
     logging.debug('added 10 rows [%d]', idx) 
if len(lst_to_ins) > 0: 
    conn.executemany(ins_sql, lst_to_ins) 
    conn.commit() 
    logging.debug('adding the last few rows to the db') 

Este código inserta entre 10 y 400 filas, entonces muere con el mensaje de error

conn.executemany(ins_sql, lst_to_ins) 
sqlite3.OperationalError: unable to open database file 

¿Cómo es posible que yo puede insertar algunas filas, pero luego obtiene este error?

+0

Estoy bastante desconcertado y no puedo decir si es un error con sqlite de 3.1, ventanas en general, vista en particular, o qué, no puedo reproducirlo. ¿Podría publicar la forma más sencilla de reproducir su problema ...? Tanques! –

+0

Tengo un problema similar con Vista y Python2.6/Django. Una forma de simular puede ser ir a la carpeta db con el explorador de Windows y forzar una actualización – luc

Respuesta

1

SQLite no tiene bloqueo de registros; usa un mecanismo de bloqueo simple que bloquea el archivo completo de la base de datos brevemente durante una escritura. Parece que estás corriendo hacia un candado que aún no se ha despejado.

El autor de SQLite recomienda que cree una transacción antes de hacer sus inserciones, y luego complete la transacción al final. Esto hace que SQLite ponga en cola las solicitudes de inserción y las realice usando un único bloqueo de archivo cuando se confirma la transacción.

En la versión más reciente de SQLite, el mecanismo de bloqueo se ha mejorado, por lo que puede que ya no requiera un bloqueo completo de archivos.

+0

Mi lectura de http://docs.python.org/3.1/library/sqlite3.html#sqlite3-controlling-transactions es eso usando el nivel de aislamiento, puedo controlar la instrucción BEGIN. La conexión de la base de datos se construye como: conn = sqlite3.connect (db_file, isolation_level = None) que debe confirmar automáticamente. También intenté usar el nivel predeterminado, pero ocurre el mismo problema. ¿Se necesita algún código adicional para iniciar una transacción antes de ejecutar la instrucción executemany? –

0

mismo error aquí en Windows 7 (Python 2.6, 1.1.1 y Django SQLLite) después de algunos registros insertados correctamente: sqlite3.OperationalError: No se puede abrir archivo de base de

me encontré con mi guión de Eclipse diferentes momentos y siempre consiguió ese error. Pero cuando lo ejecuté desde la línea de comando (después de configurar PYTHONPATH y DJANGO_SETTINGS_MODULE) funcionó como un encanto ...

¡sólo mis 2 centavos!

Cuestiones relacionadas