DBNexus 提供了一种声明式的数据库访问方法:
| ✨ 类型安全 | 🔒 权限控制 | 🏊 智能连接池 | 📊 企业级监控 |
|---|---|---|---|
| 编译时检查 | 表级 RBAC | RAII 自动管理 | Prometheus 指标 |
use dbnexus::{DbPool, db_entity};
use sea_orm::entity::prelude::*;
#[db_entity(table_name = "users", primary_key = "id")]
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "users")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i64,
pub name: String,
pub email: String,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
impl ActiveModelBehavior for ActiveModel {}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let pool = DbPool::new("sqlite::memory:").await?;
let session = pool.get_session("admin").await?;
let user = Model { id: 1, name: "Alice".to_string(), email: "alice@example.com".to_string() };
Model::insert(&session, user).await?;
Ok(())
}| 🎯 核心功能 | ⚡ 企业级功能 |
|---|---|
| 始终可用 | 按需启用 |
|
|
| 预设 | 特性 | 使用场景 |
|---|---|---|
| embedded | runtime-tokio-rustls, sqlite, config-env |
嵌入式/边缘设备超最小配置 |
| microservice | runtime-tokio-rustls, postgres, permission, sql-parser, config-env, observability |
微服务部署 |
| monolith | runtime-tokio-rustls, postgres, permission, sql-parser, yaml, data-management, security, observability |
单体应用 |
| enterprise | postgres, monolith, permission-engine |
完整企业功能 |
| all-optional | cache, observability, data-management, security, migration |
5 个聚合 feature(手动添加数据库驱动和其他特性) |
在你的 Cargo.toml 中添加:
[dependencies]
dbnexus = "0.3.0"
tokio = { version = "1.50", features = ["rt-multi-thread", "macros"] }
sea-orm = { version = "2.0.0-rc.37", features = ["macros"] }|
步骤 1:定义实体 use dbnexus::{DbPool, db_entity};
use sea_orm::entity::prelude::*;
#[db_entity(table_name = "users", primary_key = "id")]
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "users")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i64,
pub name: String,
pub email: String,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
impl ActiveModelBehavior for ActiveModel {} |
步骤 2:创建连接池 #[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let pool = DbPool::new("sqlite::memory:").await?;
let session = pool.get_session("admin").await?;
Ok(())
} |
|
步骤 3:插入数据 let user = Model {
id: 1,
name: "Alice".to_string(),
email: "alice@example.com".to_string(),
};
Model::insert(&session, user).await?; |
步骤 4:查询数据 let users = Model::find_all(&session).await?;
println!("找到 {} 个用户", users.len()); |
use dbnexus::{DbPool, db_entity};
use sea_orm::entity::prelude::*;
#[db_entity(table_name = "users", primary_key = "id")]
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "users")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i64,
pub name: String,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
impl ActiveModelBehavior for ActiveModel {}
// 管理员可以访问
let session = pool.get_session("admin").await?;
Model::find_all(&session).await?;
// 普通用户会被拒绝
let session = pool.get_session("guest").await?;
Model::find_all(&session).await?; // 错误:权限被拒绝所有用户必须更新 Cargo.toml:
v0.1.x → v0.2.0 是破坏性变更。 cache feature 不再默认启用,多个 feature 现在显式要求 cache 必须启用。
# SQLite(默认,嵌入式)
dbnexus = { version = "0.3.0", features = ["sqlite"] }
# PostgreSQL
dbnexus = { version = "0.3.0", features = ["postgres"] }
# MySQL
dbnexus = { version = "0.3.0", features = ["mysql"] }
# DuckDB(嵌入式分析型数据库,0.3.0 新增)
dbnexus = { version = "0.3.0", features = ["duckdb"] }DBNexus 通过标准协议支持以下兼容数据库(无需额外特性,使用对应协议驱动即可):
| 数据库 | 兼容协议 | 说明 |
|---|---|---|
| CockroachDB | PostgreSQL | 分布式 SQL 数据库 |
| YugabyteDB | PostgreSQL | 分布式 PostgreSQL |
| TiDB | MySQL | 分布式 HTAP 数据库 |
| MariaDB | MySQL | MySQL 兼容分支 |
| Aurora | PostgreSQL/MySQL | AWS 云原生数据库 |
# Tokio with RustLS(默认)
dbnexus = { version = "0.3.0", features = ["runtime-tokio-rustls"] }
# Tokio with Native TLS
dbnexus = { version = "0.3.0", features = ["runtime-tokio-native-tls"] }
# AsyncStd
dbnexus = { version = "0.3.0", features = ["runtime-async-std"] }# 核心功能
# 权限控制(自动启用 sql-parser + yaml + cache 特性,强制依赖 sql-parser 防 SQL 注入)
dbnexus = { version = "0.3.0", features = ["permission"] }
# SQL 解析(自动启用 cache 特性)
dbnexus = { version = "0.3.0", features = ["sql-parser"] }
# 过程宏
dbnexus = { version = "0.3.0", features = ["macros"] }
# 企业级功能
dbnexus = { version = "0.3.0", features = [
"metrics", # Prometheus 指标
"tracing", # 分布式追踪
"audit", # 审计日志
"migration", # 数据库迁移
"sharding", # 数据分片
"global-index", # 跨分片全局索引
"permission-engine", # 高级权限引擎
"authentication" # JWT 认证 + 密码强度验证(0.3.0 新增)
] }
# 配置
dbnexus = { version = "0.3.0", features = [
"yaml", # YAML 配置支持
"config-toml", # TOML 配置支持
"config-env", # 环境变量(默认)
] }| 资源 | 描述 |
|---|---|
| 📖 用户指南 | 使用 DBNexus 的全面指南 |
| 📘 API 参考 | 完整 API 文档 |
| 🏗️ 架构文档 | 系统架构和设计决策 |
| 📦 示例 | 可运行的代码示例 |
use dbnexus::{DbPool, DbConfig};
let config = DbConfig {
url: "postgresql://user:pass@localhost/db".to_string(),
max_connections: 20,
min_connections: 5,
idle_timeout: 300,
acquire_timeout: 5000,
..Default::default()
};
let pool = DbPool::with_config(config).await?; |
export DATABASE_URL="postgresql://user:pass@localhost/db"
export DB_MAX_CONNECTIONS=20
export DB_MIN_CONNECTIONS=5
export DB_ADMIN_ROLE=adminlet config = dbnexus::DbConfig::from_env()?;
let pool = dbnexus::DbPool::with_config(config).await?; |
let session = pool.get_session("admin").await?;
// 开始事务
session.begin_transaction().await?;
// 多个操作
Model::insert(&session, user1).await?;
Model::insert(&session, user2).await?;
// 提交
session.commit().await?; |
use dbnexus::{DbPool, MetricsCollector};
let pool = DbPool::new("postgresql://localhost/db").await?;
// 获取连接池状态
let status = pool.status();
println!("活跃: {}, 空闲: {}", status.active, status.idle);
// 导出 Prometheus 指标
let metrics = MetricsCollector::new();
println!("{}", metrics.export_prometheus()); |
graph TD
A[应用层<br/>使用 DbPool 和 Session 的代码] --> B[DBNexus API 层<br/>DbPool, Session<br/>权限检查<br/>事务管理]
B --> C[功能模块<br/>Config, Permission, Metrics<br/>Migration, Sharding, Audit]
C --> D[连接池层<br/>连接生命周期管理<br/>健康检查<br/>RAII 保证]
D --> E[Sea-ORM / SQLx<br/>数据库驱动<br/>查询构建器]
查看 ARCHITECTURE.md 获取详细的架构文档。
DBNexus 在设计时就考虑了安全性:
- 无 unsafe 代码 - 所有库代码都使用
#![forbid(unsafe_code)] - 权限强制执行 - 具有编译时验证的表级访问控制
- SQL 注入防护 - 默认使用参数化查询
- 配置路径验证 - 防止路径遍历攻击
- 速率限制 - 权限检查速率限制以防止滥用
# SQLite 测试
cargo test --features sqlite
# PostgreSQL 测试
cargo test --features postgres
# MySQL 测试
cargo test --features mysql
# 所有测试(需要 Docker)
make test-all# 启动数据库
make docker-up
# 运行所有测试
make test-all
# 停止数据库
make docker-down欢迎贡献!请查看仓库获取贡献指南。
# 克隆仓库
git clone https://github.com/Kirky-X/dbnexus.git
cd dbnexus
# 安装 pre-commit 钩子
./scripts/install-pre-commit.sh
# 运行测试
cargo test --all-features
# 运行 linter
cargo clippy --all-features|
📋 Issues
报告 Bug 和问题 |
💬 Discussions
提问和分享想法 |
🐙 GitHub
查看源代码 |
