Stage 8: 完成 SQLite 数据库存储集成

 新功能:
- 实现 DatabaseUserStore 结构体,支持 SQLite 数据库操作
- 创建 UserStore trait 抽象层,支持多种存储后端
- 添加数据库连接和表初始化功能
- 支持通过环境变量配置数据库 URL

🔧 技术改进:
- 使用 SQLx 进行异步数据库操作
- 实现 trait-based 存储架构,便于扩展
- 添加完整的 CRUD 数据库操作
- 支持数据库错误处理和类型转换

🧪 测试验证:
- 所有 API 端点正常工作
- 数据持久化到 SQLite 文件
- 用户创建、查询、登录功能完整
- 重复用户名检查正常工作

📁 文件变更:
- 新增: src/storage/database.rs - SQLite 存储实现
- 新增: src/storage/traits.rs - 存储抽象 trait
- 更新: src/storage/mod.rs - 导出新模块
- 更新: src/routes/mod.rs - 支持 trait 对象
- 更新: src/handlers/user.rs - 使用 trait 抽象
- 更新: src/main.rs - 数据库初始化逻辑
- 更新: Cargo.toml - 添加 SQLx 依赖
- 新增: .env - 数据库配置文件

🎯 学习目标达成:
- 掌握 Rust 数据库集成
- 理解 trait 抽象设计模式
- 学习异步数据库操作
- 实践配置管理
This commit is contained in:
2025-08-04 20:02:20 +08:00
parent 02540f17d3
commit c18f345475
10 changed files with 359 additions and 46 deletions

View File

@@ -1,11 +1,12 @@
//! Rust User API 服务器主程序
use std::net::SocketAddr;
use std::sync::Arc;
use tracing_subscriber;
use rust_user_api::{
config::Config,
routes::create_routes,
storage::memory::MemoryUserStore,
storage::{memory::MemoryUserStore, database::DatabaseUserStore, UserStore},
};
#[tokio::main]
@@ -16,8 +17,20 @@ async fn main() {
// 加载配置
let config = Config::from_env();
// 创建存储实例
let store = MemoryUserStore::new();
// 根据配置创建存储实例
let store: Arc<dyn UserStore> = if let Some(database_url) = &config.database_url {
println!("🗄️ 使用 SQLite 数据库存储: {}", database_url);
// 创建数据库存储
let db_store = DatabaseUserStore::from_url(database_url)
.await
.expect("无法连接到数据库");
Arc::new(db_store)
} else {
println!("💾 使用内存存储");
Arc::new(MemoryUserStore::new())
};
// 创建路由
let app = create_routes(store);