Как проверить, подключена ли база данных SQLite3 в Python?

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

Вопрос:

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

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

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

if os.path.exists(db):

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

Ответ №1

Это более простая идея о том, что я использовал:

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

например

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

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

Оцените статью
Добавить комментарий