簡體   English   中英

如何檢查 SQLite3 數據庫是否在 Python 中連接?

[英]How do I check if a SQLite3 database is connected in Python?

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

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

“嘗試......除了”也很有效

import sqlite3 as mdb
def chk_conn(conn):
     try:
        conn.cursor()
        return True
     except Exception as ex:
        return False

myconn = mdb.connect('test.db')
print(chk_conn(myconn))

出:真

myconn.close()
print(chk_conn(myconn))

出:假

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

正如您所說,在運行sqlite3.connect之前檢查db存在:

if os.path.exists(db):

您不能強制sqlite3.connect函數不創建 db 文件。

這更像是我一直在使用的一個簡單的解決方法:

  • 創建一個布爾標志(比如“flagConnOpen”)來表示一個打開的連接——例如在處理你的數據庫工作的類中。
  • 最初,flagConnOpen = False
  • 每當你想(有條件地)打開一個連接時,檢查這個標志是否已經為真,如果不是,打開連接並將標志設置為真。

例如

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM