feat: migrate configuration to .env environment variables

This commit implements a complete migration from JSON-based configuration
to .env environment variables, providing better security and flexibility.

Key Changes:
- Add python-dotenv dependency for environment variable support
- Create config/env_loader.py with type conversion utilities
- Add from_env() class methods to all config dataclasses
- Update ConfigLoader to prioritize environment variables
- Add save_to_env() method for .env file management
- Implement database connection factory pattern
- Add base DAO and connection classes for better abstraction
- Support both SQL Server and MySQL with unified interface
- Create migration script (scripts/migrate_to_env.py)
- Update GUI to read/write .env files
- Add comprehensive migration documentation

New Files:
- config/env_loader.py - Environment variable loader
- db/base_connection.py - Base database connection interface
- db/base_dao.py - Base DAO with common utilities
- db/connection_factory.py - Factory for creating connections
- db/mysql_connection.py - MySQL-specific connection
- db/sqlserver_connection.py - SQL Server-specific connection
- db/table_name_converter.py - SQL dialect converter
- scripts/migrate_to_env.py - Configuration migration tool
- docs/ENV_MIGRATION.md - Complete migration guide
- .env.example - Environment variable template

Testing:
- Verified MySQL connection (8.0.44)
- Tested all DAO operations
- Confirmed 150 tables accessible
- Validated configuration loading

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Misaka
2026-02-09 22:39:14 +08:00
parent 04b99292ad
commit aaa46ef282
22 changed files with 2545 additions and 563 deletions

262
docs/ENV_MIGRATION.md Normal file
View File

@@ -0,0 +1,262 @@
# .env 配置迁移指南
本文档说明如何将现有的 JSON 配置迁移到 .env 环境变量配置。
## 迁移原因
使用 .env 环境变量配置的优势:
1. **更好的安全性**: .env 文件不会被提交到版本控制(已添加到 .gitignore
2. **更灵活的配置**: 可以在不同环境(开发、测试、生产)中使用不同的配置
3. **标准化**: 遵循 12-factor 应用配置最佳实践
4. **更简单**: 配置格式更简洁,易于维护
## 迁移步骤
### 方法 1: 从现有 JSON 配置迁移(推荐)
如果你已经有 `config/user_settings.json` 配置文件,可以使用迁移脚本自动转换:
```bash
python scripts/migrate_to_env.py migrate
```
该脚本会:
- 读取 `config/user_settings.json` 文件
- 创建 `.env` 文件
- 备份原 JSON 配置到 `config/user_settings.json.backup`
### 方法 2: 从模板创建新的配置
如果是首次配置,从模板创建:
```bash
python scripts/migrate_to_env.py from-example
```
该脚本会:
- 复制 `.env.example``.env`
- 提示你编辑 `.env` 文件填入实际配置
### 手动配置
1. 复制 `.env.example``.env`:
```bash
cp .env.example .env
```
2. 编辑 `.env` 文件,填入实际的配置值:
```bash
# ERP 系统配置
ERP_URL=https://your-erp-system.com/
ERP_USERNAME=your_username
ERP_PASSWORD=your_password
# 数据库配置
DB_TYPE=sqlserver # 或 mysql
DB_SERVER=192.168.1.100
DB_NAME=YourDatabase
DB_USERNAME=your_db_username
DB_PASSWORD=your_db_password
```
## 配置验证
运行测试脚本验证配置是否正确加载:
```bash
python tests/test_env_config.py
```
## 环境变量参考
### ERP 系统配置
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `ERP_URL` | ERP 系统地址 | `https://68.11.34.30:8082/` |
| `ERP_USERNAME` | ERP 用户名 | `BLDpengqiangqiang` |
| `ERP_PASSWORD` | ERP 密码 | (必填) |
| `ERP_HEADLESS` | 无头模式 | `true` |
| `ERP_IGNORE_HTTPS_ERRORS` | 忽略 HTTPS 错误 | `true` |
| `ERP_AUTO_CLOSE_BROWSER` | 自动关闭浏览器 | `true` |
### 数据库配置SQL Server
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `DB_TYPE` | 数据库类型 | `sqlserver` |
| `DB_SERVER` | SQL Server 地址 | `192.168.110.114` |
| `DB_NAME` | 数据库名称 | `CompanyDB` |
| `DB_USERNAME` | 数据库用户名 | `peng` |
| `DB_PASSWORD` | 数据库密码 | (必填) |
| `DB_SQLSERVER_DRIVER` | ODBC 驱动 | `ODBC Driver 18 for SQL Server` |
| `DB_TRUST_SERVER_CERTIFICATE` | 信任服务器证书 | `yes` |
### 数据库配置MySQL
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `DB_TYPE` | 数据库类型 | `mysql` |
| `DB_MYSQL_HOST` | MySQL 主机地址 | `192.168.31.83` |
| `DB_MYSQL_PORT` | MySQL 端口 | `3306` |
| `DB_MYSQL_CHARSET` | 字符集 | `utf8mb4` |
### 路径配置
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `PATH_DATA_DIR` | 数据目录 | `D:/python/playwrite/data/` |
| `PATH_PRODUCTION_ID_FILE` | Production ID 文件名 | `ProductionID.txt` |
| `PATH_DEFAULT_OUTPUT` | 默认输出文件名 | `离散备料计划维护_合并.xlsx` |
| `PATH_VALIDATION_OUTPUT` | 校验输出文件名 | `物料状态校验结果.xlsx` |
### 数据提取配置
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `EXTRACTION_BATCH_SIZE` | 批次大小 | `100` |
| `EXTRACTION_VERBOSE` | 详细日志 | `true` |
| `EXTRACTION_AUTO_CONVERT` | 自动转换 Excel | `true` |
| `EXTRACTION_MERGE_BATCHES` | 合并批次 | `true` |
| `EXTRACTION_ENABLE_DB_PERSISTENCE` | 保存到数据库 | `false` |
### 校验配置
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `VALIDATION_DATA_SOURCE` | 数据源类型 | `database_full` |
| `VALIDATION_USE_DATABASE` | 使用数据库 | `true` |
| `VALIDATION_BATCH_SIZE` | 数据库批次大小 | `2000` |
| `VALIDATION_ENABLE_CRUD` | 启用 CRUD 操作 | `false` |
| `VALIDATION_DEFAULT_MANAGER` | 默认负责人 | (空) |
| `VALIDATION_MATCH_MODE` | 匹配模式 | `substring` |
## 切换数据库类型
要切换数据库类型,修改 `.env` 文件中的 `DB_TYPE` 变量:
### 切换到 MySQL
```bash
# 编辑 .env 文件
DB_TYPE=mysql
DB_NAME=BLD_DB
DB_USERNAME=remote_user
DB_PASSWORD=your_mysql_password
DB_MYSQL_HOST=192.168.31.83
DB_MYSQL_PORT=3306
```
### 切换到 SQL Server
```bash
# 编辑 .env 文件
DB_TYPE=sqlserver
DB_NAME=CompanyDB
DB_USERNAME=peng
DB_PASSWORD=your_sqlserver_password
DB_SERVER=192.168.110.114
```
## 在代码中使用配置
### 使用 ConfigLoader推荐
```python
from config.loader import ConfigLoader
# 加载配置(自动从环境变量)
config = ConfigLoader.load()
# 访问配置
erp_url = config.erp.url
db_type = config.database.db_type
```
### 直接从环境变量创建配置
```python
from config.schema import AppConfig
# 从环境变量创建配置
config = AppConfig.from_env()
```
### 使用 ConfigManagerGUI
```python
from gui.config_manager import ConfigManager
# 创建配置管理器
config_manager = ConfigManager(use_env=True)
# 访问配置
erp_url = config_manager.get("erp.url")
```
## GUI 设置界面
GUI 设置界面已更新为读写 .env 文件。所有通过界面修改的配置会自动保存到 `.env` 文件。
## 回滚方案
如果迁移后出现问题,可以回滚:
1. 恢复 JSON 配置:
```bash
cp config/user_settings.json.backup config/user_settings.json
```
2. 删除 .env 文件:
```bash
rm .env
```
3. 修改代码使用 JSON 配置(需要修改 `ConfigManager` 初始化参数):
```python
config_manager = ConfigManager(use_env=False)
```
## 安全注意事项
1. **永远不要将 .env 文件提交到版本控制**
- `.env` 已添加到 `.gitignore`
- 只提交 `.env.example` 模板文件
2. **保护敏感信息**
- 不要在代码中硬编码密码
- 使用强密码
- 定期更换密码
3. **文件权限**
- 确保 .env 文件只有你本人可读
- 在 Linux/Mac 上: `chmod 600 .env`
## 故障排除
### 配置未生效
1. 确认 `.env` 文件存在于项目根目录
2. 检查环境变量名称是否正确(区分大小写)
3. 重启应用程序以重新加载配置
### 迁移脚本错误
1. 检查 Python 版本(需要 Python 3.8+
2. 确保已安装 `python-dotenv`: `pip install python-dotenv`
3. 查看错误信息并相应解决
### 数据库连接失败
1. 验证数据库配置是否正确
2. 检查数据库服务是否运行
3. 确认网络连接正常
4. 查看数据库驱动是否已安装
## 进一步阅读
- [12-factor App: Config](https://12factor.net/config)
- [python-dotenv 文档](https://github.com/theskumar/python-dotenv)