如何检查SQLite3数据库是否在Python中连接?

vu8f3i0k  于 2022-11-14  发布在  SQLite
关注(0)|答案(3)|浏览(285)

问题1:我在Python中有一个SQLite3连接。我怎样才能检查它是否已连接?我知道如果sqlite3.Connect()失败,就会引发异常,但如果我或某些人关闭了连接,我如何检查这一点并在必要时重新打开它?
问题2:我可以在连接打开时移动文件系统中的文件(不能删除)。无论出于何种原因,数据库都会变为只读。如果我把它移回去,它就像什么都没发生一样工作。有谁能解释这一点吗?我应该在访问之前检查isfile(数据库路径)吗?

41ik7eoe

41ik7eoe1#

“试一试……除了”也很管用

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

Out:真的

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

输出:假

ztmd8pv5

ztmd8pv52#

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

1.对于读取,操作系统无论如何都应该缓存文件,以便您可以读取,如果您尝试写入,则会引发以下错误:
Sqlite3.OperationalError:尝试写入只读数据库
正如您所说,在运行sqlite3.connect之前检查db是否存在:

if os.path.exists(db):

您不能强制sqlite3.connect函数不创建db文件。

k5ifujac

k5ifujac3#

这是我一直在使用的一个简单的变通办法:

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

例如:

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

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

相关问题