2016-02-12 3 views
1

Вопрос 1: У меня есть соединение SQLite3 в Python. Как я могу проверить, подключен ли он или нет? Я знаю, что если sqlite3.connect() не работает, возникает исключение, но если я или некоторые закрывает соединение, как я могу проверить это и снова открыть его, если это необходимо?Как проверить, подключена ли база данных SQLite3 в Python?

Вопрос 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 

Как вы сказали, отметьте db Существование перед запуском sqlite3.connect:

if os.path.exists(db): 

Вы не можете заставить функцию sqlite3.connect, чтобы не создавать файл БД.

1

Это более простой работы вокруг идеи, что я использую:

  • Создать логический флаг (скажем, «flagConnOpen»), чтобы показать открытое соединение - например, в класс, который обрабатывает вашу работу db.
  • Изначально флагConnOpen = False
  • Всякий раз, когда вы хотите (условно) открыть соединение, проверьте, установлен ли этот флаг уже True, если нет, откройте соединение и установите флаг в true.

например.

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

, то вы можете поместить этот OpenConn() в начале любой функции, которую необходимо соединение, и он будет открыт один по мере необходимости.

Смежные вопросы