| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- import json
- import os
- from typing import Dict, Any
- from dotenv import load_dotenv, find_dotenv
- class DatabaseConfig:
- """数据库配置管理类"""
- def __init__(self, env_file: str = '.env'):
- self.env_file = env_file
- self._config = None
- def load_config(self) -> Dict[str, Any]:
- """从.env文件加载数据库配置"""
- if self._config is not None:
- return self._config
- # 使用 python-dotenv 加载环境变量
- # find_dotenv() 会自动查找 .env 文件
- env_path = find_dotenv(self.env_file)
- if not env_path:
- # 手动尝试多个可能的.env文件位置
- possible_paths = [
- # 当前工作目录
- os.path.join(os.getcwd(), self.env_file),
- # 项目根目录(从当前文件位置推算)
- os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), self.env_file),
- # mysql目录的上级目录的上级目录
- os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), self.env_file)
- ]
- for path in possible_paths:
- if os.path.exists(path):
- env_path = path
- break
- if not env_path:
- searched_paths = '\n'.join(possible_paths)
- raise FileNotFoundError(f"配置文件 {self.env_file} 不存在,已搜索以下路径:\n{searched_paths}")
- # 加载环境变量
- load_dotenv(env_path)
- # 从环境变量中读取 DB_INFO
- db_info_str = os.getenv('DB_INFO')
- if not db_info_str:
- raise ValueError("未找到DB_INFO配置")
- # 解析 JSON 格式的数据库配置
- try:
- self._config = json.loads(db_info_str)
- except json.JSONDecodeError as e:
- raise ValueError(f"DB_INFO配置格式错误: {e}")
- # 验证必要的配置项
- required_keys = ['host', 'database', 'user', 'passwd']
- for key in required_keys:
- if key not in self._config:
- raise ValueError(f"缺少必要的配置项: {key}")
- # 设置默认值
- self._config.setdefault('port', 3306)
- self._config.setdefault('charset', 'utf8')
- return self._config
- def get_connection_params(self) -> Dict[str, Any]:
- """获取数据库连接参数"""
- config = self.load_config()
- return {
- 'host': config['host'],
- 'port': config['port'],
- 'user': config['user'],
- 'password': config['passwd'],
- 'database': config['database'],
- 'charset': config['charset'],
- 'autocommit': False,
- 'cursorclass': None # 将在连接池中设置
- }
- # 全局配置实例
- db_config = DatabaseConfig()
|