## 配置模块使用说明
配置模块提供了统一的配置管理接口,主要功能包括:
### 数据库配置
项目使用 SQLAlchemy ORM 框架连接 MySQL 数据库,主要配置项如下:
```python
class DatabaseConfig:
host: str = "localhost" # 数据库主机
port: int = 3306 # 数据库端口
user: str = "root" # 数据库用户名
password: str = "" # 数据库密码
name: str = "question_bank" # 数据库名称
```
使用示例:
```python
from app.database.database import Database
# 初始化数据库连接
Database.initialize()
# 使用上下文管理器管理会话
with db.session() as session:
# 执行查询
users = db.execute_query("SELECT * FROM users WHERE age > :age", {"age": 18})
# 执行非查询
affected_rows = db.execute_non_query(
"UPDATE users SET status = :status WHERE id = :id",
{"status": "active", "id": 1}
)
# 批量操作
user_data = [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 30}
]
inserted_rows = db.batch_execute(
"INSERT INTO users (name, age) VALUES (:name, :age)",
user_data
)
# 兼容旧版接口
from app.database.db_mysql import get_db
db = next(get_db())
result = db.execute("SELECT * FROM users")
db.commit()
```
新特性说明:
1. 单例模式:确保全局只有一个数据库连接实例
2. 上下文管理器:自动管理会话生命周期,异常时自动回滚
3. 常用操作封装:
- execute_query:执行查询,返回字典列表
- execute_non_query:执行非查询,返回影响行数
- batch_execute:批量执行,返回总影响行数
4. 新增 initialize()方法:显式初始化数据库连接
5. 保持对旧版接口的兼容
注意事项:
1. 数据库连接字符串格式:mysql+pymysql://{user}:{password}@{host}:{port}/{name}?charset=utf8mb4
2. 数据库连接池配置:
- pool_pre_ping: True # 每次使用连接前检查连接是否有效
- pool_recycle: 3600 # 连接池回收时间(秒)
3. MySQL 驱动说明:
- PyMySQL:纯 Python 实现的 MySQL 驱动,兼容性好
- mysqlclient:C 扩展实现的 MySQL 驱动,性能更好
- 默认使用 PyMySQL,如需使用 mysqlclient:
- 安装 mysqlclient:pip install mysqlclient
- 修改连接字符串前缀为 mysql://
配置模块提供了统一的配置管理接口,主要功能包括:
- 获取配置实例
- 获取配置项值
- 注册配置变更回调
### 获取配置实例
```python
from app.config import get_config
config = get_config()
```
### 获取配置项值
```python
from app.config import get_config_value
# 获取配置项值,如果不存在则返回默认值
value = get_config_value('key', default='default_value')
```
### 注册配置变更回调
```python
from app.config import on_config_change
def callback():
print('配置已变更')
on_config_change(callback)
```
### 异常处理
所有接口都可能会抛出`RuntimeError`异常,建议在使用时进行捕获处理:
```python
try:
config = get_config()
except RuntimeError as e:
print(f'获取配置失败:{e}')
```
## 环境配置说明
项目支持多环境配置,通过不同的配置文件管理:
- application.yml:基础配置
- application-dev.yml:开发环境配置
- application-prod.yml:生产环境配置
### 配置优先级
1. 环境特定配置(application-{env}.yml)
2. 基础配置(application.yml)
### 环境切换
通过设置环境变量`APP_ENV`来切换环境:
#### 项目级设置(推荐)
在项目根目录下创建`.env`文件,内容如下:
```env
# 开发环境
ENV=dev
# 生产环境
# ENV=prod
```
注意:
1. 该设置仅对当前项目有效
2. .env 文件应添加到.gitignore 中,避免将环境配置提交到代码库
3. 如果同时存在系统环境变量和.env 文件,.env 文件的优先级更高
#### Windows 系统
1. 临时设置(仅当前命令行窗口有效):
```cmd
:: 开发环境
set ENV=dev
:: 生产环境
set ENV=prod
```
2. 永久设置:
- 右键点击"此电脑" -> "属性" -> "高级系统设置"
- 点击"环境变量"按钮
- 在"系统变量"或"用户变量"中新建变量:
- 变量名:ENV
- 变量值:dev(开发环境)或 prod(生产环境)
#### macOS/Linux 系统
```bash
# 开发环境
export ENV=dev
# 生产环境
export ENV=prod
```
### 各环境主要差异
| 配置项 | 开发环境 | 生产环境 |
| -------------------- | ----------------- | ------------------- |
| app.debug | true | false |
| database.host | localhost | db.prod.example.com |
| database.name | question_bank_dev | question_bank_prod |
| logging.path | logs | /var/log/app |
| logging.level | DEBUG | INFO |
| logging.retention | 7 天 | 30 天 |
| logging.max_size | 10MB | 100MB |
| logging.backup_count | 5 | 30 |
## 日志配置说明
项目使用 loguru 库进行日志管理,主要特性包括:
- 开发环境:
- 日志级别:DEBUG
- 日志路径:logs/
- 日志文件:app\_{time:YYYY-MM-DD}.log(按日期自动分割)
- 日志保留:7 天
- 日志格式:{time:YYYY-MM-DD HH:mm:ss.SSS} | {level} | {module}:{line} - {message}
- 控制台输出:彩色格式({time} | {level} | {module}:{line} - {message})
- 旧日志压缩:自动压缩为 zip 格式
- 最大文件大小:10MB
- 生产环境:
- 日志级别:INFO
- 日志路径:/var/log/app
- 日志文件:app\_{time:YYYY-MM-DD}.log(按日期自动分割)
- 日志保留:30 天
- 日志格式:{time:YYYY-MM-DD HH:mm:ss.SSS} | {level} | {module}:{line} - {message}
- 控制台输出:简洁格式
- 旧日志压缩:自动压缩为 zip 格式
- 最大文件大小:100MB
使用示例:
```python
from app.logger import logger
logger.info("这是一条信息日志")
logger.error("这是一条错误日志", exc_info=True)
```
## 新增日志功能说明
1. 按日期分割日志文件:
- 每天生成一个新的日志文件,文件名格式为 app_YYYY-MM-DD.log
- 自动处理日志文件切换,无需重启应用
2. 自动清理旧日志:
- 开发环境保留最近 7 天的日志
- 生产环境保留最近 30 天的日志
- 超过保留期限的日志文件会被自动删除
3. 日志压缩:
- 旧日志文件会被自动压缩为 zip 格式保存
- 压缩后的文件名格式为 app_YYYY-MM-DD.log.zip
4. 线程安全:
- 日志写入操作是线程安全的
- 支持多线程并发写入日志
5. 异常处理:
- 日志初始化失败时会抛出异常
- 日志写入失败时会自动重试