rustminidb 0.2.0

A lightweight embedded database with native REST API
# RustMinidb


**轻量级嵌入式关系型数据库 · 原生 REST API · 单文件存储 · 多数据库支持**

RustMinidb 是一个使用 Rust 编写的轻量级嵌入式关系型数据库,基于 [redb](https://github.com/cberner/redb) 存储引擎(ACID、MVCC、单文件)。原生内置 HTTP REST API 服务器,支持**多数据库同时打开**、**文件监听自动重载**,适合物联网、边缘计算和嵌入式场景。

---

## 特性


### ⚡ 核心能力


| 特性 | 说明 |
|---|---|
| **嵌入式** | 无需独立服务进程,可作为 Rust 库直接嵌入你的程序 |
| **SQL 支持** | 标准 SQL 语法(CREATE / INSERT / SELECT / UPDATE / DELETE / DROP) |
| **ACID 事务** | 基于 redb 引擎,支持原子性、一致性、隔离性、持久性 |
| **MVCC** | 多版本并发控制,读写互不阻塞 |
| **单文件存储** | 整个数据库存储在一个 `.db` 文件中,零配置 |
| **多数据类型** | INTEGER、FLOAT、TEXT、BLOB、BOOLEAN、TIMESTAMP |

### 🆕 v0.2.0 新特性


| 特性 | 说明 |
|---|---|
| **📁 多数据库支持** | 同时打开多个数据库文件,API 和 Shell 中自由切换 |
| **👀 文件监听自动重载** | 监听 `.db` 文件变化,自动刷新数据库连接(`--watch`|
| **🎨 全新 Logo** | 科技感 "R" 图标 + "RustMinidb" 块状字标启动画面 |
| **🔀 Shell 多库切换** | `.use <db_name>` 命令切换数据库,`.databases` 列出所有加载库 |

### 🌐 REST API 服务器


**公开端点(免认证):**

| 端点 | 方法 | 说明 |
|------|------|------|
| `/` | GET | Web 管理后台页面 |
| `/v1/health` | GET | 健康检查(负载均衡器监控) |

**需认证端点(Bearer Token):**

| 端点 | 方法 | 说明 |
|------|------|------|
| `/v1/query` | POST | 执行 SQL 语句 |
| `/v1/tables` | GET | 列出所有表 |
| `/v1/schema/{table}` | GET | 查看指定表结构 |
| `/v1/export` | GET | 导出数据库为 SQL |
| `/v1/metrics` | GET | 运行时监控指标 |
| `/v1/databases` | GET | 列出所有数据库(含多库管理) |
| `/v1/databases/switch` | POST | 切换当前数据库 |
| `/v1/databases/create` | POST | 创建新数据库 |
| `/v1/databases/delete` | POST | 删除数据库 |
| `/v1/import` | POST | 数据导入 |

### 🛠️ 实用工具


- **交互式 Shell** — 类似 `sqlite3` 的命令行控制台,支持多数据库切换
- **SQL 导出迁移** — 支持 Standard / MySQL / PostgreSQL / SQLite 四种方言
- **监控仪表盘** — 运行时 QPS、延迟、连接数等指标
- **彩色 Banner** — 增强型启动欢迎画面(ANSI 彩色 "R" Logo)
- **请求追踪** — UUID 级请求链路追踪
- **🔒 API 认证** — Bearer Token 保护全部数据接口

---

## 使用场景


| 场景 | 说明 |
|---|---|
| **🔌 物联网 / 边缘计算** | 嵌入式设备上的本地数据存储,通过 REST API 远程查询 |
| **📱 移动 / 桌面应用** | 作为应用内数据库,替代 SQLite 的 Rust 原生方案 |
| **🧪 测试 / 原型开发** | 快速搭建数据层原型,无需安装独立数据库 |
| **🔐 嵌入式安全场景** | 单文件加密存储,无网络端口暴露(library 模式) |
| **📦 CI/CD 管道** | 轻量级测试数据库,毫秒级启动 |

---

## 快速开始


### 安装


**方式一:下载预编译二进制**

从 [Releases](https://github.com/rustminidb/rustminidb/releases) 下载对应平台的二进制文件。

**方式二:从源码编译**

```bash
# 确保已安装 Rust 工具链(https://rustup.rs

cargo install rustminidb
```

**方式三:作为依赖库(Cargo)**

```toml
[dependencies]
rustminidb = "0.2"
```

### 基本使用


#### 🔹 命令行模式


```bash
# 初始化数据库

rustminidb init --db mydata.db

# 执行单条 SQL

rustminidb exec --db mydata.db "CREATE TABLE sensors (id INT PRIMARY KEY, value FLOAT)"
rustminidb exec --db mydata.db "INSERT INTO sensors VALUES (1, 25.6)"
rustminidb exec --db mydata.db "SELECT * FROM sensors"

# 启动交互式 Shell

rustminidb shell --db mydata.db

# 启动 HTTP 服务器(无认证,仅限开发环境)

rustminidb serve --host 0.0.0.0 --port 8080 --db mydata.db

# 启动 HTTP 服务器(推荐:开启 Bearer Token 认证)

rustminidb serve --host 0.0.0.0 --port 8080 --db mydata.db --api-token "your-secret-token"

# 也可通过环境变量设置 Token(避免命令行泄露)

set RUSTMINIDB_API_TOKEN=your-secret-token
rustminidb serve --host 0.0.0.0 --port 8080 --db mydata.db

# ── v0.2.0 新特性 ──────────────────────────────────


# 多数据库同时打开(支持任意数量)

rustminidb serve --db data1.db --db data2.db --db data3.db

# 多数据库 Shell

rustminidb shell --db orders.db --db inventory.db

# 文件监听自动重载(数据库文件变化时自动刷新)

rustminidb serve --db mydata.db --watch

# 多数据库 + 文件监听组合

rustminidb serve --db data1.db --db data2.db --db data3.db --watch

# ──────────────────────────────────────────────────


# 导出数据库为 SQL

rustminidb export --db mydata.db --output backup.sql

# 查看版本

rustminidb version
```

#### 🔹 交互式 Shell 命令


在 `shell` 模式下可使用以下内置命令:

| 命令 | 说明 |
|---|---|
| `.tables` | 列出所有表 |
| `.schema` | 查看所有表结构 |
| `.databases` | 列出所有已加载的数据库(v0.2.0) |
| `.use <name>` | 切换到指定数据库(v0.2.0) |
| `.monitor` | 显示运行时指标 |
| `.export` | 导出整个数据库为 SQL |
| `.exit` / `.quit` | 退出 Shell |
| `.help` | 显示帮助 |

#### 🔹 REST API 使用


```bash
# 启动服务器(推荐开启认证)

rustminidb serve --host 0.0.0.0 --port 8080 --db mydata.db --api-token "my-secret-token"

# 执行 SQL(需在请求头中携带 Token)

curl -X POST http://localhost:8080/v1/query \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer my-secret-token" \
  -d '{"sql": "SELECT * FROM sensors"}'

# 健康检查(公开端点,无需 Token)

curl http://localhost:8080/v1/health

# 查看监控指标(需 Token)

curl -H "Authorization: Bearer my-secret-token" http://localhost:8080/v1/metrics

# 导出数据库(需 Token)

curl -H "Authorization: Bearer my-secret-token" http://localhost:8080/v1/export

# 列出所有数据库(需 Token)

curl -H "Authorization: Bearer my-secret-token" http://localhost:8080/v1/databases

# 切换数据库(需 Token)

curl -X POST http://localhost:8080/v1/databases/switch \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer my-secret-token" \
  -d '{"name": "data2.db"}'
```

#### 🔹 嵌入式 Rust 库


```rust
use rustminidb::Database;

// 打开数据库
let db = Database::open("mydata.db").unwrap();

// 建表
db.execute("CREATE TABLE sensors (id INT PRIMARY KEY, value FLOAT)").unwrap();

// 插入数据
db.execute("INSERT INTO sensors VALUES (1, 25.6)").unwrap();

// 查询数据
let rows = db.query("SELECT * FROM sensors").unwrap();
for row in rows {
    println!("{:?}", row);
}
```

---

## 🔒 安全


### API 访问认证


RustMinidb 内置 **Bearer Token 认证** 保护所有数据接口,防止未授权访问。

```bash
# 方式一:命令行参数(推荐)

rustminidb serve --api-token "your-secret-token"

# 方式二:环境变量(避免 Token 出现在进程列表)

export RUSTMINIDB_API_TOKEN="your-secret-token"
rustminidb serve
```

**认证规则:**

| 规则 | 说明 |
|---|---|
| 未设置 Token | 所有接口完全公开(仅限开发环境) |
| 设置 Token |`/``/v1/health` 外全部接口需 `Authorization: Bearer <token>` |
| Token 为空 | 等同于未设置,不启用认证 |
| 认证失败 | 返回 HTTP `401 Unauthorized` |

**公开端点(免认证):**

| 端点 | 用途 |
|---|---|
| `GET /` | Web 管理后台页面 |
| `GET /v1/health` | 健康检查(用于负载均衡器监控) |

**安全建议:**

- 生产环境**必须**设置 `--api-token`
- 通过环境变量 `RUSTMINIDB_API_TOKEN` 传入 Token,避免命令行历史泄露
- 使用反向代理(nginx / caddy)终止 TLS/SSL,确保传输加密
- 定期更换 Token

---

## 配置


RustMinidb 支持 TOML 配置文件,默认值如下:

```toml
[server]
host = "0.0.0.0"
port = 8080
maxConnections = 100
queryTimeoutMs = 5000

[storage]
dbPath = "data.db"
cacheSizeMb = 64

[logging]
level = "info"
format = "text"
```

可通过命令行参数覆盖:

```bash
rustminidb serve --host 127.0.0.1 --port 9090 --db mydb.db
```

---

## SQL 支持


RustMinidb 支持以下 SQL 语法(MVP 阶段):

| 语句 | 示例 |
|---|---|
| CREATE TABLE | `CREATE TABLE users (id INT PRIMARY KEY, name TEXT, age INT)` |
| INSERT | `INSERT INTO users VALUES (1, 'Alice', 30)` |
| SELECT | `SELECT * FROM users WHERE age > 20` |
| UPDATE | `UPDATE users SET age = 31 WHERE id = 1` |
| DELETE | `DELETE FROM users WHERE id = 2` |
| DROP TABLE | `DROP TABLE IF EXISTS users` |

支持的数据类型:`INTEGER`、`FLOAT`、`TEXT`、`BLOB`、`BOOLEAN`、`TIMESTAMP`

支持的比较运算符:`=`、`!=`、`<`、`>`、`<=`、`>=`、`AND`、`OR`

---

## 数据迁移与导出


支持四种 SQL 方言导出:

```bash
# 标准格式导出

rustminidb export --db mydata.db --output export.sql

# 导出兼容 MySQL

# (可通过 Rust API 配置 dialect: SqlDialect::MySQL)


# 导出兼容 PostgreSQL

# (可通过 Rust API 配置 dialect: SqlDialect::PostgreSQL)

```

导出特性:
- ✅ CREATE TABLE IF NOT EXISTS
- ✅ 批量 INSERT(可配置每批行数)
- ✅ DROP TABLE IF EXISTS 前缀
- ✅ 事务包裹(BEGIN / COMMIT)
- ✅ 表注释导出
- ✅ 多方言类型映射
- ✅ 进度回调

---

## 构建


```bash
# 克隆仓库

git clone https://github.com/rustminidb/rustminidb.git
cd rustminidb

# 构建(默认启用 server 特性)

cargo build --release

# 仅构建 library(无 HTTP 服务器)

cargo build --release --no-default-features

# 运行测试

cargo test --lib

# 查看帮助

./target/release/rustminidb --help
```

---

## 技术栈


| 组件 | 技术 |
|---|---|
| 编程语言 | Rust (edition 2021) |
| 存储引擎 | [redb]https://github.com/cberner/redb (ACID, MVCC, 单文件) |
| SQL 解析 | [sqlparser-rs]https://github.com/sqlparser-rs/sqlparser-rs |
| REST 框架 | [axum]https://github.com/tokio-rs/axum |
| 运行时 | [tokio]https://github.com/tokio-rs/tokio |
| 序列化 | serde / bincode / serde_json |
| 日志 | tracing / tracing-subscriber |

---

## 许可证


本项目基于 **BSL-1.1 许可证**(Boost Software License 1.0)发布。

```
Boost Software License - Version 1.0

Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation...
```

---

## 相关链接


- **仓库**: https://github.com/rustminidb/rustminidb
- **文档**: https://docs.rs/rustminidb
- **主页**: https://rustminidb.dev