Я создаю класс, который будет управлять подключением к базе данных Firebird.Служба Firebird будет установлена для облегчения нескольких подключений к базе данных.К сожалению, среды, в которых будет развертываться мое программное обеспечение, могут быть нестабильными, и я не всегда могу гарантировать, что служба Firebird будет работать, когда я пытаюсь подключиться, или что она продолжит работать после того, как я установлю соединение.
В интересах централизации обработки ошибок я принял решение, что разрозненные части моего кода никак не будут напрямую работать с курсорами базы данных.Вместо этого я покажу методы query()
и dml()
из диспетчера подключений.Это работает, в некоторой степени, с учетом приведенного ниже кода (некоторый код не включен для краткости).
class DBConnection(object):
# self._conn is an instance of kinterbasdb.connect()
def query(self, query, params = None):
cursor = self._conn.cursor()
if params:
cursor.execute(query, params)
else:
cursor.execute(query)
return [[x[0].title() for x in cursor.description]] + [r for r in cursor.fetchall()]
def dml(self, query, params = None):
cursor = self._conn.cursor()
if params:
cursor.execute(query, params)
else:
cursor.execute(query)
self._conn.commit()
Проблема проявляется, когда служба Firebird останавливается или по какой-либо причине недоступна.Я ожидал бы, что self._conn.cursor()
выдаст исключение, что упростит выполнение чего-то вроде этого:
class DBConnection(object):
# self._conn is an instance of kinterbasdb.connect()
def cursor(self):
try:
return self._conn.cursor()
except:
# Error handling code here, possibly reconnect, display alert.
def query(self, query, params = None):
cursor = self.cursor()
def dml(self, query, params = None):
cursor = self.cursor()
К сожалению, при запросе курсора не возникает исключение.Я не узнаю о проблеме до звонка на cursor.execute()
.Это означает, что, если я хочу правильно централизовать обработку ошибок, я должен сделать что-то вроде этого:
class DBConnection(object):
# self._conn is an instance of kinterbasdb.connect()
def cursor(self):
try:
cursor = self._conn.cursor()
cursor.execute("Select NULL From <sometable>")
return cursor
except:
# Error handling code here, possibly reconnect, display alert.
Это требует дополнительного обхода в моей базе данных, тратит впустую транзакцию (базы данных Firebird имеютжесткий верхний предел на общее количество транзакций для жизни базы данных), и, как правило, просто чувствует себя неправильно.Мне интересно, кто-нибудь сталкивался с чем-то похожим с другими реализациями Python Database API, и если да, то как они были преодолены?