2009-10-07 19 views
6

Sto lavorando su una macchina Windows Vista in Python 3.1.1. Sto cercando di inserire un numero elevato di righe in un db SQLite3. Il file esiste e il mio programma inserisce correttamente alcune righe nel db. Tuttavia, a un certo punto del processo di inserimento, il programma muore con questo messaggio: sqlite3.OperationalError: impossibile aprire il file di databasePython sqlite3 "impossibile aprire il file di database" su windows

Tuttavia, prima che muoia, ci sono diverse righe che vengono correttamente aggiunte al database.

Ecco il codice che gestisce in particolare l'inserimento:

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') 

Questo codice inserisce ovunque da 10 a 400 righe, poi muore con il messaggio di errore

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

Come è possibile che io puoi inserire alcune righe, ma poi ottieni questo errore?

+0

Sono abbastanza perplesso e non riesco a capire se si tratta di un bug con sqlite di 3.1, windows in generale, vista in particolare, o cosa - non riesco a riprodurlo. Potresti pubblicare il modo più semplice che trovi per riprodurre il tuo problema ...? Carri armati! –

+0

Ho un problema simile con Vista e Python2.6/Django. Un modo per simulare può essere quello di andare alla cartella db con Windows Explorer e quindi forzare un aggiornamento – luc

risposta

1

SQLite non ha il blocco dei record; utilizza un meccanismo di blocco semplice che blocca l'intero file del database brevemente durante una scrittura. Sembra che tu stia correndo in una serratura che non è ancora stata cancellata.

L'autore di SQLite consiglia di creare una transazione prima di eseguire i propri inserimenti e quindi completare la transazione alla fine. In questo modo SQLite accoda le richieste di inserimento e le esegue utilizzando un blocco di file singolo quando viene eseguita la transazione.

Nella versione più recente di SQLite, il meccanismo di blocco è stato migliorato, quindi potrebbe non richiedere più un blocco di file completo.

+0

La mia lettura di http://docs.python.org/3.1/library/sqlite3.html#sqlite3-controlling-transactions è quella usando il livello di isolamento, posso controllare l'istruzione BEGIN. La connessione al database è costituita come: conn = sqlite3.connect (db_file, isolation_level = None) che dovrebbe auto-commit. Ho provato a utilizzare anche il livello predefinito, ma si verifica lo stesso problema. Esiste un codice aggiuntivo necessario per avviare una transazione prima di eseguire l'istruzione executemany? –

0

stesso errore qui su Windows 7 (Python 2.6, Django 1.1.1 e SqlLite) dopo alcuni record inseriti correttamente: sqlite3.OperationalError: Impossibile aprire il file di database

ho eseguito il mio script da Eclipse tempi diversi e sempre ottenuto questo errore Ma come l'ho eseguito dalla riga di comando (dopo aver impostato PYTHONPATH e DJANGO_SETTINGS_MODULE) ha funzionato come un fascino ...

solo i miei 2 centesimi!

Problemi correlati