mysql异常处理装饰器

mysql装饰器的使用

复制代码
import pymysql
from pymysql import err
from contextlib import closing
import json
def ini():
    #json 配置文件
    with open('../conf/cfg.json') as f:
        config = json.load(f)
    return config
# 定义异常处理装饰器
def db_exception_handler(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except pymysql.err.OperationalError as e:
            print(f"[ERROR] Operational Error in {func.__name__}: {str(e)}")
        except pymysql.err.ProgrammingError as e:
            print(f"[ERROR] Programming Error in {func.__name__}: {str(e)}")
        except pymysql.err.IntegrityError as e:
            print(f"[ERROR] Integrity Error in {func.__name__}: {str(e)}")
        except Exception as e:
            print(f"[ERROR] General Error in {func.__name__}: {str(e)}")
        finally:
            # 确保在所有情况下都关闭数据库连接
            if 'conn' in kwargs and kwargs['conn']:
                kwargs['conn'].close()
    return wrapper
#创建数据库链接上下文管理器
def Connect_database(host, port, user, password, charset, database):
    mysql = pymysql.connect(host = host, port = port, user = user, password = password, charset = charset, database = database)
    db = mysql.cursor()
    return db,mysql
#关闭mysql链接
def Close_database(db,mysql):
    # 游标关闭
    db.close()
    # 关闭连接
    mysql.close()
#使用装饰器的查询函数
@db_exception_handler
def query_data(conn):
    conn.execute("SELECT * FROM users LIMIT 5")
    results = db.fetchall()
    for row in results:
        print(row)
# 主程序
if __name__ == "__main__":

    # 获取mysql配置文件
    config = ini()
    mysqlConfig = config['mysql']
    # 获取数据库连接
    db,mysql = Connect_database(mysqlConfig['host'],mysqlConfig['port'],mysqlConfig['user'],mysqlConfig['password'],mysqlConfig['charset'],mysqlConfig['database'])
    # 查询数据
    query_data(db)
    # 手动关闭连接(虽然装饰器也会确保关闭)
    Close_database(db,mysql)
复制代码

 

posted @   潇潇暮鱼鱼  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2022-02-18 四层负载均衡和七层负载均衡
2022-02-18 nginx重新编译添加ssl模块--with-http_ssl_module
点击右上角即可分享
微信分享提示