代码
import pymysql
from dbutils.pooled_db import PooledDB
def auto_retry(func):
def inner(*args, **kwargs):
for i in range(3):
try:
return func(*args, **kwargs)
except Exception as e:
print('执行异常 >> {} >> {}'.format(func.__name__, e))
return inner
class MysqlConnectionPool:
def __init__(self, cfg, mark=False):
self.pool = PooledDB(pymysql, **cfg)
self.mark = mark
def get_conn_curs(self):
conn = self.pool.connection()
curs = conn.cursor(pymysql.cursors.DictCursor) if self.mark else conn.cursor()
return conn, curs
def close_conn_curs(self, curs, conn):
curs.close()
conn.close()
@auto_retry
def exe_sql(self, sql, args=None, way=None):
conn, curs = self.get_conn_curs()
try:
curs.execute(sql, args=args)
conn.commit()
except Exception as e:
conn.rollback()
print("error >> exe_sql >> {}".format(e))
return False
else:
if way == 1:
return curs.fetchone()
elif way == 2:
return curs.fetchall()
else:
return True
finally:
self.close_conn_curs(curs, conn)
使用示例
if __name__ == '__main__':
cfg = {
'host': 'localhost',
'port': 3306,
'user': '用户名',
'password': '密码',
'database': 'test',
'charset': 'utf8mb4',
'maxconnections': 4,
'mincached': 0,
'maxcached': 0,
'maxusage': 0,
'blocking': True
}
handler = MysqlConnectionPool(cfg)
res = handler.exe_sql('show tables', way=None)
print(res)
res = handler.exe_sql('show tables', way=1)
print(res)
res = handler.exe_sql('show tables', way=2)
print(res)