本次重构主要解决了backend/core/init_app.py和backend/core/database.py中的代码重复问题,并统一使用backend/conf/constants.py中定义的路径变量,提高了代码的可维护性和一致性。
- 合并init_app.py和database.py中重复的数据库初始化代码
- 统一数据库初始化逻辑到database.py中
- 使用backend/conf/constants.py中定义的backend_path变量
- 避免硬编码路径,提高代码可维护性
- 明确各模块的职责分工
- 提高代码的可读性和可维护性
# 重构前
DATABASE_URL = settings.get("DATABASE_URL", "sqlite://./data/aitestlab.db")
# 重构后
from backend.conf.constants import backend_path
data_dir = backend_path / "data"
db_file = data_dir / "aitestlab.db"
DATABASE_URL = settings.get("DATABASE_URL", f"sqlite://{db_file}")# 新增:从init_app.py迁移的init_data函数
async def init_data():
"""初始化应用数据 - 从init_app.py迁移过来"""
logger.info("开始初始化应用数据...")
try:
# 初始化数据库
logger.debug("初始化数据库连接...")
await init_db()
# 预热缓存
logger.debug("预热应用缓存...")
# 这里可以添加缓存预热逻辑
# 检查外部服务连接
logger.debug("检查外部服务连接...")
# 这里可以添加外部服务检查逻辑
logger.success("🚀 应用数据初始化完成")
except Exception as e:
logger.error(f"应用数据初始化失败: {e}")
raise# 重构前
db_dir = os.path.dirname(DATABASE_URL.replace("sqlite://", ""))
if db_dir and not os.path.exists(db_dir):
os.makedirs(db_dir, exist_ok=True)
# 重构后
logger.info(f"数据目录: {data_dir}")
if not data_dir.exists():
data_dir.mkdir(parents=True, exist_ok=True)
logger.info(f"创建数据目录: {data_dir}")# 重构前
async def init_data():
"""Initialize application data"""
logger.info("开始初始化应用数据...")
try:
# 初始化数据库
logger.debug("初始化数据库连接...")
from backend.api_core.database import init_db
await init_db()
# 示例:预热缓存
logger.debug("预热应用缓存...")
# 示例:检查外部服务连接
logger.debug("检查外部服务连接...")
logger.success("🚀 应用数据初始化完成")
except Exception as e:
logger.error(f"应用数据初始化失败: {e}")
raise
# 重构后
async def init_data():
"""Initialize application data"""
logger.info("开始初始化应用数据...")
try:
# 使用database.py中的统一初始化函数
from backend.api_core.database import init_data as db_init_data
await db_init_data()
logger.success("🚀 应用数据初始化完成")
except Exception as e:
logger.error(f"应用数据初始化失败: {e}")
raise# 重构前:包含完整的数据库初始化逻辑
async def init_database():
"""初始化数据库"""
try:
# 确保数据目录存在
db_dir = os.path.dirname(DATABASE_URL.replace("sqlite://", ""))
# ... 大量重复代码
# 重构后:使用database.py中的统一函数
async def init_database():
"""初始化数据库 - 使用database.py中的统一函数"""
close_db = None
try:
from backend.api_core.database import init_data, close_db
logger.info("开始初始化数据库...")
await init_data()
logger.success("数据库初始化完成")
except Exception as e:
logger.error(f"数据库初始化失败: {e}")
raise
finally:
if close_db:
await close_db()# 重构前
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# 重构后
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, project_root)- 重复代码减少: 移除了init_app.py中重复的数据库初始化逻辑
- 统一入口: 所有数据库相关操作统一在database.py中管理
- 维护简化: 数据库逻辑修改只需在一个地方进行
- 常量使用: 统一使用backend/conf/constants.py中的backend_path
- 路径一致: 避免了硬编码路径带来的维护问题
- 可移植性: 提高了代码的可移植性和环境适应性
- 职责清晰: database.py专注数据库相关功能
- 模块化: 各模块职责分工明确
- 可读性: 代码结构更加清晰易懂
backend/core/database.py # 主要重构文件
├── 添加路径变量使用
├── 合并init_data函数
├── 优化路径处理逻辑
└── 改进日志输出
backend/core/init_app.py # 简化文件
├── 移除重复的数据库初始化代码
├── 使用database.py中的统一函数
└── 保持原有接口不变
backend/init_db.py # 脚本优化
├── 修复模块导入路径
├── 使用统一的初始化函数
└── 简化脚本逻辑
init_app.py
↓ 调用
database.py::init_data()
↓ 调用
database.py::init_db()
↓ 调用
database.py::create_default_user()
init_db.py
↓ 直接调用
database.py::init_data()
# constants.py中的路径定义
backend_path = Path(__file__).parent.parent
# database.py中的使用
data_dir = backend_path / "data"
db_file = data_dir / "aitestlab.db"
DATABASE_URL = settings.get("DATABASE_URL", f"sqlite://{db_file}")# settings.yaml中保持不变,作为默认值
DATABASE_URL: "sqlite://./data/aitestlab.db"- ✅ 数据库初始化正常
- ✅ 默认用户创建成功
- ✅ 应用启动正常
- ✅ 路径解析正确
- ✅ 原有API接口不变
- ✅ 配置文件兼容
- ✅ 启动流程不变
- ✅ 数据库结构不变
- 单一职责: 每个模块专注自己的职责
- DRY原则: 避免重复代码
- 配置统一: 使用统一的配置管理
- 常量定义: 在constants.py中定义路径常量
- 相对路径: 使用相对路径提高可移植性
- 路径验证: 在使用前验证路径存在性
- 异常捕获: 完善的异常处理机制
- 日志记录: 详细的操作日志
- 优雅降级: 失败时的优雅处理
- 考虑将用户创建逻辑独立成单独的服务
- 数据库迁移逻辑可以进一步抽象
- 考虑使用环境变量覆盖默认配置
- 添加配置验证机制
- 添加单元测试覆盖重构的代码
- 集成测试验证整体功能
本次重构成功实现了:
🎯 代码质量提升: 消除重复代码,提高可维护性 🔧 架构优化: 明确模块职责,改善代码结构 📁 路径管理: 统一路径变量使用,提高一致性 🚀 功能保持: 保持原有功能不变,确保兼容性
重构后的代码更加清晰、可维护,为后续功能开发奠定了良好的基础。