import mysql.connector from mysql.connector import Error from .config import MYSQL_CONFIG # 关键:声明类级别的连接池实例(必须有这一行!) _connection_pool = None # 确保这一行存在,且拼写正确 class Database: """MySQL 连接池管理类""" pool_config = { "host": MYSQL_CONFIG.get("host", "localhost"), "port": int(MYSQL_CONFIG.get("port", 3306)), "user": MYSQL_CONFIG.get("user", "root"), "password": MYSQL_CONFIG.get("password", ""), "database": MYSQL_CONFIG.get("database", ""), "charset": MYSQL_CONFIG.get("charset", "utf8mb4"), "pool_name": "fastapi_pool", "pool_size": 5, "pool_reset_session": True } @classmethod def get_connection(cls): """获取数据库连接""" try: # 从连接池获取连接 conn = mysql.connector.connect(**cls.pool_config) if conn.is_connected(): return conn except Error as e: # 抛出数据库连接错误(会被全局异常处理器捕获) raise Exception(f"MySQL 连接失败: {str(e)}") from e @classmethod def close_connection(cls, conn, cursor=None): """关闭连接和游标""" try: if cursor: cursor.close() if conn and conn.is_connected(): conn.close() except Error as e: raise Exception(f"MySQL 连接关闭失败: {str(e)}") from e @classmethod def close_all_connections(cls): """清理连接池(服务重启前调用)""" try: # 先检查属性是否存在,再判断是否有值 if hasattr(cls, "_connection_pool") and cls._connection_pool: cls._connection_pool = None # 重置连接池 print("[Database] 连接池已重置,旧连接将被自动清理") else: print("[Database] 连接池未初始化或已重置,无需操作") except Exception as e: print(f"[Database] 重置连接池失败: {str(e)}") # 暴露数据库操作工具 db = Database()