如何用Python检查SQLite3数据库是否已连接?

2024-06-13 21:34:39 发布

您现在位置:Python中文网/ 问答频道 /正文

问题1:我在Python中有一个SQLite3连接。如何检查它是否连接?我知道如果sqlite3.connect()失败,会引发异常,但是如果我或其他人关闭了连接,我如何检查它并在必要时重新打开它?

问题2:当连接打开时,我可以在文件系统中移动文件(无法删除)。无论出于什么原因,数据库都将变成只读的。如果我把它移回去,就好像什么都没发生一样。有人能解释一下吗?在访问之前应该检查isfile(dbpath)吗?


Tags: 文件数据库connect原因sqlite3dbpathisfile
2条回答

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

You can't force the sqlite3.connect function to not create the db file.

这更像是我一直在使用的一个简单的解决方案:

  • 创建一个布尔标志(比如“flagConnOpen”)来表示一个打开的连接——例如在处理数据库工作的类中。
  • 最初,flagConnOpen=False
  • 每当您想(有条件地)打开一个连接时,请检查此标志是否已经为True,如果不是,请打开该连接并将该标志设置为True。

例如

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

然后可以将这个OpenConn()放在任何需要连接的函数的开头,它将根据需要打开一个连接。

相关问题 更多 >