如何检查Python中是否连接了SQLite3数据库?
问题描述:
问题1:我在Python中有一个SQLite3连接。我如何检查它是否连接?我知道如果sqlite3.connect()失败,会引发异常,但如果我或某些关闭了连接,我该如何检查并在必要时重新打开它?如何检查Python中是否连接了SQLite3数据库?
问题2:我可以在连接打开时移动文件系统中的文件(不可删除)。无论出于何种原因,数据库都将变为只读。如果我把它移回去,它就好像什么都没发生一样。有人可以解释这一点吗?我应该在访问之前检查isfile(dbpath)吗?
答
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
功能无法创建数据库文件。
答
这更多的是一种简单的变通的想法,我一直在使用:
- 创建一个布尔标志(比如,“flagConnOpen”),以表示这是一个开放的连接 - 例如在处理你的数据库工作的类。
- 最初,flagConnOpen = False
- 无论何时您想(有条件地)打开一个连接,检查该标志是否已经为True,如果不是,打开连接并将该标志设置为true。
例如
...
def OpenConn(self):
if(self.flagConnOpen == False):
self.db = sqlite3.connect(self.dbPath);
self.flagConnOpen = True;
然后你可以把这个OpenConn()放在任何需要连接的函数的开始处,它会根据需要打开一个。