## `database` 目录功能总结
`src/database/` 是项目的**数据库连接层**,封装了 **PostgreSQL** 和 **Redis** 两种数据源的连接管理,并通过项目的 DI 容器实现全局单例注入。
### 文件结构
```
src/database/
├── mod.rs # 模块导出
├── database.rs # PostgreSQL 连接封装
├── database_init.rs # Database 单例注册(自动生成)
├── database_test.rs # PostgreSQL 测试
├── redisclient.rs # Redis 客户端封装
├── redisclient_init.rs # RedisClient 单例注册(自动生成)
└── redisclient_test.rs # Redis 测试
```
---
### 1. `Database` — PostgreSQL 连接
[`database.rs`](file:///E:/soft/gitee.com/ruwebframe/src/database/database.rs)
| **结构体** | `Database { gorm: Gorm, datasource: DataSource }` |
| **配置来源** | 从全局配置 `rucfg::find_bean_ruconfig()` 读取 `gorm` 和 `datasource` |
| **核心方法** | `conn()` → 创建 `postgres::Client` 连接,返回 `Result<Client, postgres::Error>` |
| **注入方式** | 单例(`register_singleton`),全局唯一实例 |
| **获取方式** | `database::find_bean_database().unwrap()` 获取 `Arc<Database>` |
使用示例(来自 [database_test.rs](file:///E:/soft/gitee.com/ruwebframe/src/database/database_test.rs)):
```rust
// 建表
let db = database::find_bean_database().unwrap();
db.conn().unwrap().execute("CREATE TABLE IF NOT EXISTS users1 (...)", &[]);
// 查询
for row in db.conn().unwrap().query("SELECT * FROM users LIMIT 3", &[]) {
println!("{:?}", row.get::<_, i32>(0));
}
```
---
### 2. `RedisClient` — Redis 客户端
[`redisclient.rs`](file:///E:/soft/gitee.com/ruwebframe/src/database/redisclient.rs)
| **结构体** | `RedisClient { redisDto: RedisDto, client: Option<redis::Client> }` |
| **配置来源** | 从全局配置 `rucfg::find_bean_ruconfig()` 读取 `redis` 配置 |
| **Trait** | `TraitRedis` 定义了 `conn()`、`set_key()`、`get_key()`、`del_key()` 四个接口 |
| **核心方法** | `reopen()` 重新打开连接;`set_key/get_key/del_key` 键值操作 |
| **注入方式** | 单例(`register_singleton`),全局唯一实例 |
| **获取方式** | `database::find_bean_redisclient().unwrap()` 获取 `Arc<RedisClient>` |
---
### 3. 自动注入机制
`database_init.rs` 和 `redisclient_init.rs` 是**自动生成的代码**(注释标注 `StructInit自动生成`),通过 `#[ctor(unsafe)]` 在程序启动时自动注册到 DI 容器:
```
程序启动 → ctor 自动执行 init() → register_bean_xxx() → direg::register_singleton()
```
之后任何地方通过 `find_bean_database()` / `find_bean_redisclient()` 即可获取全局单例。
---
### 架构图示
```
┌─────────────────────────────────────────┐
│ rucfg (全局配置) │
│ datasource / gorm / redis 配置项 │
└──────────────┬──────────────────────────┘
│ 读取配置
┌──────────┴──────────┐
▼ ▼
┌───────────┐ ┌──────────────┐
│ Database │ │ RedisClient │
│ (PG连接) │ │ (Redis连接) │
└─────┬─────┘ └──────┬───────┘
│ │
▼ ▼
┌─────────────────────────────────────────┐
│ DI 容器 (direg 全局单例) │
│ find_bean_database() / find_bean_redisclient() │
└─────────────────────────────────────────┘
```
简而言之,`database` 目录就是一个**统一的数据源访问层**,将 PostgreSQL 和 Redis 的连接管理封装为 DI 单例,配合项目的自动注入框架,实现"配置驱动、即取即用"的数据库访问模式。