2016-02-12 157 views
1

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

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

回答

1

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功能无法创建数据库文件。

1

这更多的是一种简单的变通的想法,我一直在使用:

  • 创建一个布尔标志(比如,“flagConnOpen”),以表示这是一个开放的连接 - 例如在处理你的数据库工作的类。
  • 最初,flagConnOpen = False
  • 无论何时您想(有条件地)打开一个连接,检查该标志是否已经为True,如果不是,打开连接并将该标志设置为true。

例如

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

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