2016-02-12 158 views
1

問題1:我在Python中有一個SQLite3連接。我如何檢查它是否連接?我知道如果sqlite3.connect()失敗,會引發異常,但如果我或某些關閉了連接,我該如何檢查並在必要時重新打開它?如何檢查Python中是否連接了SQLite3數據庫?

問題2:我可以在連接打開時移動文件系統中的文件(不可刪除)。無論出於何種原因,數據庫都將變爲只讀。如果我把它移回去,它就好像什麼都沒發生一樣。有人可以解釋這一點嗎?我應該在訪問之前檢查isfile(dbpath)嗎?

回答

1

1)使用psutils檢查數據庫文件使用的過程:

import os 
import psutil 
import sqlite3 

con = sqlite3.connect('temp.db') 

def is_open(path): 
    for proc in psutil.process_iter(): 
     try: 
      files = proc.get_open_files() 
      if files: 
       for _file in files: 
        if _file.path == path: 
         return True  
     except psutil.NoSuchProcess as err: 
      print(err) 
    return False 
con = sqlite3.connect('temp.db') 

path = os.path.abspath('temp.db') 

print(is_open(path)) 
con.close() 
print(is_open(path)) 

輸出:

True 
False 

2)閱讀,操作系統應該反正緩存的文件,這樣就可以閱讀,如果你嘗試寫下面的錯誤會被提出:

sqlite3.OperationalError: attempt to write a readonly database 

正如你所說的檢查012運行sqlite3.connect前所有腦幹:

if os.path.exists(db): 

你不能強迫sqlite3.connect功能無法創建數據庫文件。

1

這更多的是一種簡單的變通的想法,我一直在使用:

  • 創建一個布爾標誌(比如,「flagConnOpen」),以表示這是一個開放的連接 - 例如在處理你的數據庫工作的類。
  • 最初,flagConnOpen = False
  • 無論何時您想(有條件地)打開一個連接,檢查該標誌是否已經爲True,如果不是,打開連接並將該標誌設置爲true。

例如

... 
def OpenConn(self): 
    if(self.flagConnOpen == False): 
     self.db = sqlite3.connect(self.dbPath); 
     self.flagConnOpen = True; 

然後你可以把這個OpenConn()放在任何需要連接的函數的開始處,它會根據需要打開一個。