2010-04-02 115 views
4

我有一個Python應用程序拋出標準sqlite3.OperationalError: database is locked錯誤。我查看了互聯網,找不到任何可行的解決方案(請注意,沒有多進程/線程正在進行,正如您所看到的,我已嘗試提高超時參數)。 sqlite文件存儲在本地硬盤上。sqlite3.OperationalError:數據庫被鎖定 - 非線程應用程序

以下函數是訪問sqlite數據庫的許多函數之一,它在第一次調用時運行良好,但在第二次調用時會拋出上述錯誤(在另一個函數中調用for循環的一部分功能):

def update_index(filepath): 
    path = get_setting('Local', 'web') 
    stat = os.stat(filepath) 
    modified = stat.st_mtime 
    index_file = get_setting('Local', 'index') 

    connection = sqlite3.connect(index_file, 30) 
    cursor = connection.cursor() 
    head, tail = os.path.split(filepath) 
    cursor.execute('UPDATE hwlive SET date=? WHERE path=? AND name=?;', (modified, head, tail)) 
    connection.commit() 
    connection.close() 

非常感謝。

回答

1

您是否真的需要爲每個UPDATE連續打開和關閉數據庫文件?如果你在每一個訪問數據庫的功能做同樣的事情,是有可能,你已經調用從使用不同的連接已經打開的數據庫,並在修改數據庫的過程中的另一功能的update_index功能?

+0

數據庫在調用此函數之前應該完全關閉。如果我打算保持數據庫連接,那麼最好的方法是什麼?將'connection'實例存儲在函數的作用域之外,還是將其作爲參數傳遞? – 2010-04-04 13:14:58

+3

這將是整潔,如果你犯了一個類,把處理中的類數據庫中的所有功能,有連接作爲類的成員屬性。你可以在'__init__'類中創建連接,並添加一個close_connection(具有明顯的內容)方法,當你完成時調用。否則,你可以搜索你的代碼,並添加調試語句,只要你打開和關閉與數據庫的連接,查看它們是否嵌套。 – tzot 2010-04-04 15:44:03

相關問題