rat_quickdb

🚀 强大的跨数据库ODM库,支持SQLite、PostgreSQL、MySQL、MongoDB的统一接口
🌐 语言版本: 中文 | English | 日本語
✨ 核心特性
- 🎯 自动索引创建: 基于模型定义自动创建表和索引,无需手动干预
- 🗄️ 多数据库支持: SQLite、PostgreSQL、MySQL、MongoDB
- 🔗 统一API: 一致的接口操作不同数据库
- 🔒 SQLite布尔值兼容: 自动处理SQLite布尔值存储差异,零配置兼容
- 🏊 连接池管理: 高效的连接池和无锁队列架构
- ⚡ 异步支持: 基于Tokio的异步运行时
- 🧠 智能缓存: 内置缓存支持(基于rat_memcache),支持TTL过期和回退机制
- 🆔 多种ID生成策略: AutoIncrement、UUID、Snowflake、ObjectId、Custom前缀
- 📝 日志控制: 由调用者完全控制日志初始化,避免库自动初始化冲突
- 🐍 Python绑定: 可选Python API支持
- 📋 任务队列: 内置异步任务队列系统
- 🔍 类型安全: 强类型模型定义和验证
📦 安装
在Cargo.toml中添加依赖:
[dependencies]
rat_quickdb = "0.2.3"
🚀 快速开始
基本使用
use rat_quickdb::*;
use rat_quickdb::types::{CacheConfig, CacheStrategy, TtlConfig, L1CacheConfig, CompressionConfig, CompressionAlgorithm};
use std::collections::HashMap;
#[tokio::main]
async fn main() -> QuickDbResult<()> {
init();
let config = DatabaseConfig::builder()
.db_type(DatabaseType::SQLite)
.connection(ConnectionConfig::SQLite {
path: ":memory:".to_string(),
create_if_missing: true,
})
.pool(PoolConfig::default())
.alias("main".to_string())
.id_strategy(IdStrategy::AutoIncrement)
.cache(CacheConfig {
enabled: true,
strategy: CacheStrategy::Lru,
ttl_config: TtlConfig {
default_ttl_secs: 300,
max_ttl_secs: 3600,
check_interval_secs: 60,
},
l1_config: L1CacheConfig {
max_capacity: 1000,
max_memory_mb: 64,
enable_stats: true,
},
l2_config: None,
compression_config: CompressionConfig {
enabled: false,
algorithm: CompressionAlgorithm::Lz4,
threshold_bytes: 1024,
},
version: "1".to_string(),
})
.build()?;
add_database(config).await?;
let mut user_data = HashMap::new();
user_data.insert("name".to_string(), DataValue::String("张三".to_string()));
user_data.insert("email".to_string(), DataValue::String("zhangsan@example.com".to_string()));
user_data.insert("age".to_string(), DataValue::Int(25));
create("users", user_data, Some("main")).await?;
let user = find_by_id("users", "1", Some("main")).await?;
println!("找到用户: {:?}", user);
Ok(())
}
模型定义(推荐方式)
use rat_quickdb::*;
use serde::{Serialize, Deserialize};
rat_quickdb::define_model! {
struct User {
id: Option<i32>,
username: String,
email: String,
age: i32,
is_active: bool,
}
collection = "users",
fields = {
id: integer_field(None, None),
username: string_field(Some(50), Some(3), None).required(),
email: string_field(Some(255), Some(5), None).required().unique(),
age: integer_field(Some(0), Some(150)),
is_active: boolean_field(),
}
indexes = [
{ fields: ["username"], unique: true, name: "idx_username" },
{ fields: ["email"], unique: true, name: "idx_email" },
{ fields: ["age"], unique: false, name: "idx_age" },
],
}
#[tokio::main]
async fn main() -> QuickDbResult<()> {
init();
let config = sqlite_config("main", "test.db", PoolConfig::default())?;
add_database(config).await?;
let user = User {
id: None,
username: "张三".to_string(),
email: "zhangsan@example.com".to_string(),
age: 25,
is_active: true,
};
let user_id = user.save().await?;
println!("用户创建成功,ID: {}", user_id);
if let Some(found_user) = ModelManager::<User>::find_by_id(&user_id).await? {
println!("找到用户: {} ({})", found_user.username, found_user.email);
}
Ok(())
}
🔒 SQLite布尔值兼容性
SQLite数据库将布尔值存储为整数(0和1),这可能导致serde反序列化错误。rat_quickdb提供了多种解决方案:
方案1: sqlite_bool_field() - 推荐(零配置)
use rat_quickdb::*;
rat_quickdb::define_model! {
struct User {
id: Option<i32>,
username: String,
is_active: bool, is_pinned: bool, is_verified: bool, }
collection = "users",
fields = {
id: integer_field(None, None),
username: string_field(Some(50), Some(3), None).required(),
is_active: sqlite_bool_field(),
is_pinned: sqlite_bool_field(),
is_verified: sqlite_bool_field_with_default(false),
}
}
方案2: 手动serde属性 + 通用反序列化器
use rat_quickdb::*;
use serde::Deserialize;
#[derive(Debug, Serialize, Deserialize)]
struct User {
id: Option<i32>,
username: String,
#[serde(deserialize_with = "rat_quickdb::sqlite_bool::deserialize_bool_from_any")]
is_active: bool,
#[serde(deserialize_with = "rat_quickdb::sqlite_bool::deserialize_bool_from_int")]
is_pinned: bool,
}
rat_quickdb::define_model! {
struct User {
id: Option<i32>,
username: String,
is_active: bool,
is_pinned: bool,
}
collection = "users",
fields = {
id: integer_field(None, None),
username: string_field(Some(50), Some(3), None).required(),
is_active: boolean_field(),
is_pinned: boolean_field(),
}
}
方案3: 传统方式(需要手动处理)
rat_quickdb::define_model! {
struct User {
id: Option<i32>,
username: String,
is_active: bool, }
collection = "users",
fields = {
id: integer_field(None, None),
username: string_field(Some(50), Some(3), None).required(),
is_active: boolean_field(), }
}
反序列化器选择指南
deserialize_bool_from_any(): 支持整数、布尔值、字符串 "true"/"false"
deserialize_bool_from_int(): 支持整数和布尔值
sqlite_bool_field(): 自动选择最佳反序列化器
迁移指南
从传统boolean_field()迁移到sqlite_bool_field():
is_active: boolean_field(),
is_active: sqlite_bool_field(),
🆔 ID生成策略
rat_quickdb支持多种ID生成策略,满足不同场景的需求:
AutoIncrement(自增ID)
DatabaseConfig::builder()
.id_strategy(IdStrategy::AutoIncrement)
.build()?
UUID(通用唯一标识符)
DatabaseConfig::builder()
.id_strategy(IdStrategy::Uuid)
.build()?
Snowflake(雪花算法)
DatabaseConfig::builder()
.id_strategy(IdStrategy::Snowflake {
machine_id: 1,
datacenter_id: 1
})
.build()?
ObjectId(MongoDB风格)
DatabaseConfig::builder()
.id_strategy(IdStrategy::ObjectId)
.build()?
Custom(自定义前缀)
DatabaseConfig::builder()
.id_strategy(IdStrategy::Custom("user_".to_string()))
.build()?
🧠 缓存配置
基本缓存配置
use rat_quickdb::types::{CacheConfig, CacheStrategy, TtlConfig, L1CacheConfig};
let cache_config = CacheConfig {
enabled: true,
strategy: CacheStrategy::Lru,
ttl_config: TtlConfig {
default_ttl_secs: 300, max_ttl_secs: 3600, check_interval_secs: 60, },
l1_config: L1CacheConfig {
max_capacity: 1000, max_memory_mb: 64, enable_stats: true, },
l2_config: None, compression_config: CompressionConfig::default(),
version: "1".to_string(),
};
DatabaseConfig::builder()
.cache(cache_config)
.build()?
缓存统计和管理
let stats = get_cache_stats("default").await?;
println!("缓存命中率: {:.2}%", stats.hit_rate * 100.0);
println!("缓存条目数: {}", stats.entries);
clear_cache("default").await?;
clear_all_caches().await?;
📝 日志控制
rat_quickdb现在完全由调用者控制日志初始化:
use rat_logger::{Logger, LoggerBuilder, LevelFilter};
let logger = LoggerBuilder::new()
.with_level(LevelFilter::Debug)
.with_file("app.log")
.build();
logger.init().expect("日志初始化失败");
rat_quickdb::init();
🔧 数据库配置
SQLite
use rat_quickdb::*;
let pool_config = PoolConfig::default();
let config = sqlite_config(
"sqlite_db",
"./test.db",
pool_config
)?;
add_database(config).await?;
PostgreSQL
use rat_quickdb::*;
let pool_config = PoolConfig::default();
let config = postgres_config(
"postgres_db",
"localhost",
5432,
"mydatabase",
"username",
"password",
pool_config
)?;
add_database(config).await?;
MySQL
use rat_quickdb::*;
let pool_config = PoolConfig::default();
let config = mysql_config(
"mysql_db",
"localhost",
3306,
"mydatabase",
"username",
"password",
pool_config
)?;
add_database(config).await?;
MongoDB
基础配置(使用便捷函数)
use rat_quickdb::*;
let pool_config = PoolConfig::default();
let config = mongodb_config(
"mongodb_db",
"localhost",
27017,
"mydatabase",
Some("username"),
Some("password"),
pool_config
)?;
add_database(config).await?;
高级配置(使用构建器)
use rat_quickdb::*;
let pool_config = PoolConfig::default();
let tls_config = TlsConfig {
enabled: true,
verify_server_cert: false,
verify_hostname: false,
..Default::default()
};
let zstd_config = ZstdConfig {
enabled: true,
compression_level: Some(3),
compression_threshold: Some(1024),
};
let builder = MongoDbConnectionBuilder::new("localhost", 27017, "mydatabase")
.with_auth("username", "password")
.with_auth_source("admin")
.with_direct_connection(true)
.with_tls_config(tls_config)
.with_zstd_config(zstd_config);
let config = mongodb_config_with_builder(
"mongodb_db",
builder,
pool_config,
)?;
add_database(config).await?;
🛠️ 核心API
数据库管理
init() - 初始化库
add_database(config) - 添加数据库配置
remove_database(alias) - 移除数据库配置
get_aliases() - 获取所有数据库别名
set_default_alias(alias) - 设置默认数据库别名
模型操作(推荐)
let user_id = user.save().await?;
let found_user = ModelManager::<User>::find_by_id(&user_id).await?;
let users = ModelManager::<User>::find(conditions, options).await?;
let mut updates = HashMap::new();
updates.insert("username".to_string(), DataValue::String("新名字".to_string()));
let updated = user.update(updates).await?;
let deleted = user.delete().await?;
ODM操作(底层接口)
create(collection, data, alias) - 创建记录
find_by_id(collection, id, alias) - 根据ID查找
find(collection, conditions, options, alias) - 查询记录
update(collection, id, data, alias) - 更新记录
delete(collection, id, alias) - 删除记录
count(collection, query, alias) - 计数
exists(collection, query, alias) - 检查是否存在
🏗️ 架构特点
rat_quickdb采用现代化架构设计:
- 无锁队列架构: 避免直接持有数据库连接的生命周期问题
- 模型自动注册: 首次使用时自动注册模型元数据
- 自动索引管理: 根据模型定义自动创建表和索引
- 跨数据库适配: 统一的接口支持多种数据库类型
- 异步消息处理: 基于Tokio的高效异步处理
🔄 工作流程
应用层 → 模型操作 → ODM层 → 消息队列 → 连接池 → 数据库
↑ ↓
└────────────── 结果返回 ←────────────────┘
📊 性能特性
- 连接池管理: 智能连接复用和管理
- 异步操作: 非阻塞的数据库操作
- 批量处理: 支持批量操作优化
- 缓存集成: 内置缓存减少数据库访问
- 压缩支持: MongoDB支持ZSTD压缩
🎯 支持的字段类型
integer_field - 整数字段(支持范围和约束)
string_field - 字符串字段(支持长度限制,可设置大长度作为长文本使用)
float_field - 浮点数字段(支持范围和精度)
boolean_field - 布尔字段
datetime_field - 日期时间字段
uuid_field - UUID字段
json_field - JSON字段
array_field - 数组字段
list_field - 列表字段(array_field的别名)
dict_field - 字典/对象字段(基于Object类型)
reference_field - 引用字段(外键)
📝 索引支持
- 唯一索引:
unique() 约束
- 复合索引: 多字段组合索引
- 普通索引: 基础查询优化索引
- 自动创建: 基于模型定义自动创建
- 跨数据库: 支持所有数据库类型的索引
🌟 版本信息
当前版本: 0.2.3
支持Rust版本: 1.70+
重要更新: v0.2.0 完整修复时间日期字段功能,支持完整的DateTime处理!
📄 许可证
本项目采用 LGPL-v3 许可证。
🤝 贡献
欢迎提交Issue和Pull Request来改进这个项目!
📞 联系方式
如有问题或建议,请通过以下方式联系: