欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DBUtils手动设置异常的作用

程序员文章站 2022-06-08 18:05:32
...

DBUtils 是一套允许线程化 Python 程序可以安全和有效的访问数据库的模块。DBUtils已经作为 Webware for Python 一部分用来结合 PyGreSQL 访问 PostgreSQL 数据库,他也可以用在其他Python应用程序中来访问 DB-API 2 兼容的数据库接口。

 

我的数据库是postgresql,  python的模块用的是psycopg2。一直用的挺好,但是最近发现个问题:postgresql重启后,app server会报InterfaceError异常。我就纳闷鸟,难道DBUtils连接池中的实例没有自动重连数据库功能?? 但是用mysql时,重新启动数据库就没有这个问题。

 

展开google大法也不得解,没有办法只好扒DButils代码,终于发现问题拉。

 

我的DBUtils系介样子用滴:

 

DBPARAMS ={
    'creator': psycopg2,  #MySQLdb    
    'host': 'localhost', 
    'user': 'postgres', 
    'password': 'postgres', 
    'database': 'bob',
}
pool = PooledDB(maxusage=1000,  **DBPARAMS)

 

用MySQLdb连接mysql时,如果mysql重启了,MySQLdb抛出OperationalError异常,DBUtils抓住后(SteadyDB.py346行),尝试重新连接mysql。很好, 没有问题。

 

 用psycopg2连接postgresql时,如果postgresql重启了,psycopg2第一次抛出OperationalError异常, 之后一直抛InterfaceError异常,DBUtils默认的异常中没有对InterfaceError异常的处理。 完蛋!!

 

难道只能在DButils的源码中添加??  见SteadyDB.py239行。

 

不过还好人家DBUtils早就意识到不同的DB-API2库可能会对数据库异常的处理有所不同,在PooledDB中有个failures参数,在连接postgresql时,手动指定异常InterfaceError即可。

DBPARAMS ={
    'creator': psycopg2,  
    'failures': (psycopg2.InterfaceError, )
    'host': 'localhost', 
    'user': 'postgres', 
    'password': 'postgres', 
    'database': 'bob',
}