2009-10-07 108 views
6

我在Windows Vista計算機上的python 3.1.1工作窗口。我正在嘗試將大量的行插入到SQLite3數據庫中。該文件存在,並且我的程序正確地將一些行插入到數據庫中。但是,在插入過程的某個時刻,程序將隨着此消息而死亡: sqlite3.OperationalError:無法打開數據庫文件Python的sqlite3的「無法打開數據庫文件」關於

但是,在它死亡之前,有幾行正確添加到數據庫中。

這裏是一個專門處理的插入的代碼:

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

此代碼插入從10至400行的任何地方,然後用該錯誤消息

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

模具如何是有可能,我可以插入一些行,但然後得到這個錯誤?

+0

我很不知所措,不能判斷它是否與3.1的sqlite的一個bug,在一般情況下,在Vista中特別,或者說窗口 - 我不能複製。你能發佈最簡單的方法來重現你的問題......?坦克! – 2009-10-07 05:24:08

+0

我有Vista和Python2.6/Django類似的問題。一種模擬方法可能是使用Windows資源管理器轉到db文件夾,然後強制刷新 – luc 2010-03-26 10:45:38

回答

1

SQLite沒有記錄鎖定;它使用一個簡單的鎖定機制,在寫入過程中簡要鎖定整個數據庫文件。這聽起來像你正在運行一個還沒有清理的鎖。

的SQLite筆者建議你之前做你插入創建一個事務,然後完成在結束交易。這會導致SQLite對插入請求進行排隊,並在事務提交時使用單個文件鎖執行它們。

SQLite中的最新版本,鎖定機制進行了改進,所以它可能不是需要一個完整的文件鎖定了。

+0

我的閱讀http://docs.python.org/3.1/library/sqlite3.html#sqlite3-controlling-transactions是使用隔離級別,我可以控制BEGIN語句。數據庫連接被構造爲: 康恩= sqlite3.connect(db_file,ISOLATION_LEVEL =無) 應自動提交。我試過使用默認級別,但同樣的問題發生。 在運行executemany語句之前是否需要一些額外的代碼來啓動事務? – 2009-10-07 16:20:08

0

同樣的錯誤,在這裏的Windows 7(Python 2.6中,Django的1.1.1和sqllite)後,一些記錄插入正確:sqlite3.OperationalError:無法打開數據庫文件

我跑我的劇本從Eclipse中不同的時間和總得到了那個錯誤。但正如我在命令行中運行它(後設置PYTHONPATH和DJANGO_SETTINGS_MODULE)它的工作作爲一個魅力...

只是我的2美分!

相關問題