繁体   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