hwhkit 0.1.2

一个用于快速构建 Web 服务的 Rust 工具库
Documentation
# 数据库支持

HwhKit 提供了对关系数据库和向量数据库的支持,可以根据配置灵活加载。

## 功能特性

- **关系数据库支持**: 通过 SQLx 支持 PostgreSQL、MySQL 和 SQLite
- **向量数据库支持**: 集成 Qdrant 向量数据库
- **配置驱动**: 通过配置文件控制数据库的启用和连接参数
- **连接池管理**: 自动管理数据库连接池
- **健康检查**: 提供数据库连接状态检查

## 启用数据库功能

### 1. 在 Cargo.toml 中启用特性

```toml
[dependencies]
hwhkit = { version = "0.1", features = ["database", "vector"] }
```

或者只启用需要的功能:

```toml
# 只启用关系数据库
hwhkit = { version = "0.1", features = ["database"] }

# 只启用向量数据库
hwhkit = { version = "0.1", features = ["vector"] }
```

### 2. 配置数据库

在配置文件(如 `config.toml`)中添加数据库配置:

#### 关系数据库配置

```toml
[database]
enabled = true
db_type = "postgres"  # 支持: postgres, mysql, sqlite
url = "postgresql://user:password@localhost:5432/myapp"
max_connections = 10
min_connections = 2
connect_timeout = 30
auto_migrate = false
```

**配置说明:**

- `enabled`: 是否启用数据库(true/false)
- `db_type`: 数据库类型,支持 `postgres``mysql``sqlite`
- `url`: 数据库连接 URL
- `max_connections`: 连接池最大连接数
- `min_connections`: 连接池最小连接数
- `connect_timeout`: 连接超时时间(秒)
- `auto_migrate`: 是否自动运行迁移(当前版本保留字段)

**连接 URL 示例:**

```toml
# PostgreSQL
url = "postgresql://user:password@localhost:5432/database"

# MySQL
url = "mysql://user:password@localhost:3306/database"

# SQLite (文件)
url = "sqlite:./app.db"

# SQLite (内存)
url = "sqlite::memory:"
```

#### Qdrant 向量数据库配置

```toml
[qdrant]
enabled = true
url = "http://localhost:6334"
api_key = ""  # 可选,如果 Qdrant 需要认证
timeout = 30
default_collection = "default"
```

**配置说明:**

- `enabled`: 是否启用向量数据库(true/false)
- `url`: Qdrant 服务器地址
- `api_key`: API 密钥(可选)
- `timeout`: 请求超时时间(秒)
- `default_collection`: 默认集合名称

## 使用示例

### 基本使用

```rust
use hwhkit::{WebServerBuilder, database::Database};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建服务器(数据库会根据配置自动初始化)
    let server = WebServerBuilder::new()
        .config_from_file("config.toml")
        .routes(app_routes)
        .build()
        .await?;

    // 获取数据库实例
    if let Some(db) = server.database() {
        println!("数据库已连接");

        // 测试连接
        db.ping().await?;
    }

    server.serve().await?;
    Ok(())
}
```

### 在 Axum 路由中使用

```rust
use axum::{extract::State, Json};
use hwhkit::database::Database;

// 定义应用状态
#[derive(Clone)]
struct AppState {
    db: Database,
}

// 路由处理函数
async fn list_users(State(state): State<AppState>) -> Json<Vec<User>> {
    let pool = state.db.pool();

    // 使用 SQLx 查询
    let users = sqlx::query_as::<_, User>("SELECT * FROM users")
        .fetch_all(pool)
        .await
        .unwrap();

    Json(users)
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let server = WebServerBuilder::new()
        .config_from_file("config.toml")
        .build()
        .await?;

    let state = AppState {
        db: server.database().unwrap().clone(),
    };

    let app = Router::new()
        .route("/users", get(list_users))
        .with_state(state);

    let final_server = hwhkit::server::WebServer::new(app, server.config().clone());
    final_server.serve().await?;

    Ok(())
}
```

### 使用向量数据库

```rust
use hwhkit::database::VectorDatabase;

async fn search_vectors(State(state): State<AppState>) -> Json<SearchResult> {
    if let Some(vdb) = &state.vector_db {
        // 列出所有集合
        let collections = vdb.list_collections().await?;

        // 使用 Qdrant 客户端
        let client = vdb.client();
        // ... 执行向量搜索操作
    }

    Json(result)
}
```

## 数据库操作

### 关系数据库

```rust
// 获取连接池
let pool = db.pool();

// 执行查询
let users = sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = ?")
    .bind(user_id)
    .fetch_all(pool)
    .await?;

// 执行插入
sqlx::query("INSERT INTO users (name, email) VALUES (?, ?)")
    .bind(&user.name)
    .bind(&user.email)
    .execute(pool)
    .await?;

// 执行原始 SQL
db.execute_raw("CREATE TABLE IF NOT EXISTS users (...)").await?;
```

### 向量数据库

```rust
use qdrant_client::qdrant::{CreateCollection, VectorParams, Distance};

// 创建集合
let client = vdb.client();
client.create_collection(&CreateCollection {
    collection_name: "my_collection".to_string(),
    vectors_config: Some(VectorParams {
        size: 384,
        distance: Distance::Cosine.into(),
        ..Default::default()
    }.into()),
    ..Default::default()
}).await?;

// 检查集合是否存在
let exists = vdb.collection_exists("my_collection").await?;

// 列出所有集合
let collections = vdb.list_collections().await?;
```

## 示例项目

查看完整的示例代码:

```bash
# 运行数据库示例(需要启用 database 特性)
cargo run --example database-example --features database

# 运行带向量数据库的示例(需要 Qdrant 服务运行)
cargo run --example database-example --features "database,vector"
```

示例文件位置:
- `examples/database-example.rs` - 完整的数据库使用示例
- `examples/database-config.toml` - 示例配置文件

## 迁移管理

HwhKit 推荐使用 SQLx 的迁移功能管理数据库模式:

```bash
# 安装 sqlx-cli
cargo install sqlx-cli

# 创建迁移
sqlx migrate add create_users_table

# 运行迁移
sqlx migrate run --database-url "postgresql://..."
```

## 最佳实践

1. **连接池配置**: 根据应用负载调整 `max_connections``min_connections`
2. **错误处理**: 始终处理数据库操作可能的错误
3. **安全性**:
   - 不要在代码中硬编码数据库凭证
   - 使用环境变量或安全的配置管理
   - 在生产环境使用强密码
4. **性能优化**:
   - 使用连接池
   - 适当使用索引
   - 批量操作时使用事务
5. **监控**: 定期检查数据库连接状态和性能

## 故障排查

### 数据库连接失败

如果遇到连接问题:

1. 检查配置文件中的 URL 格式是否正确
2. 确认数据库服务正在运行
3. 检查网络连接和防火墙设置
4. 查看应用日志中的详细错误信息

### 向量数据库连接失败

1. 确认 Qdrant 服务正在运行:`docker ps` 或检查服务状态
2. 验证 URL 配置正确
3. 如果使用 API Key,确保配置正确

## 更多资源

- [SQLx 文档]https://docs.rs/sqlx/
- [Qdrant 文档]https://qdrant.tech/documentation/
- [HwhKit 完整文档]./README.md