我正在创建一个将管理与Firebird数据库的连接的类。 Firebird服务将被安装以促进与数据库的多个连接。不幸的是,我的软件部署的环境可能很不稳定,而且我不能始终保证Firebird服务在我尝试连接时运行,或者在建立连接后继续运行。为了集中化错误处理,我做出了决定,我的代码的不同部分不会以任何方式直接与数据库游标一起工作。相反,我会从我的连接管理器中公开query()
和dml()
方法。考虑到下面的代码(为了简洁起见,一些代码不包括在内),这可以起到扩展的作用。Python数据库游标异常时机
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.
这需要一个额外的往返到我的数据库,浪费了交易(火鸟数据库有一个硬上限制数据库使用期限内的总交易),并且通常只是感觉错误。我想知道,有没有人遇到类似Python数据库API的其他实现,如果有的话,他们是如何克服的?