Crates.io | rat_quickdb |
lib.rs | rat_quickdb |
version | 0.1.9 |
created_at | 2025-09-25 19:31:03.384519+00 |
updated_at | 2025-09-26 01:31:21.752259+00 |
description | 强大的跨数据库ODM库,支持自动索引创建、统一接口和现代异步架构 |
homepage | https://github.com/0ldm0s/rat_quickdb |
repository | https://github.com/0ldm0s/rat_quickdb |
max_upload_size | |
id | 1855031 |
size | 1,203,781 |
🚀 强大的跨数据库ODM库,支持SQLite、PostgreSQL、MySQL、MongoDB的统一接口
在Cargo.toml
中添加依赖:
[dependencies]
rat_quickdb = "0.1.8"
use rat_quickdb::*;
use rat_quickdb::types::{CacheConfig, CacheStrategy, TtlConfig, L1CacheConfig, CompressionConfig, CompressionAlgorithm};
use std::collections::HashMap;
#[tokio::main]
async fn main() -> QuickDbResult<()> {
// 初始化库(日志系统由调用者自行初始化)
init();
// 添加SQLite数据库连接(带缓存配置)
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(())
}
rat_quickdb支持多种ID生成策略,满足不同场景的需求:
DatabaseConfig::builder()
.id_strategy(IdStrategy::AutoIncrement)
.build()?
DatabaseConfig::builder()
.id_strategy(IdStrategy::Uuid)
.build()?
DatabaseConfig::builder()
.id_strategy(IdStrategy::Snowflake {
machine_id: 1,
datacenter_id: 1
})
.build()?
DatabaseConfig::builder()
.id_strategy(IdStrategy::ObjectId)
.build()?
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, // 5分钟缓存
max_ttl_secs: 3600, // 最大1小时
check_interval_secs: 60, // 检查间隔
},
l1_config: L1CacheConfig {
max_capacity: 1000, // 最多1000个条目
max_memory_mb: 64, // 64MB内存限制
enable_stats: true, // 启用统计
},
l2_config: None, // 不使用L2磁盘缓存
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(不再自动初始化日志)
rat_quickdb::init();
use rat_quickdb::*;
let pool_config = PoolConfig::default();
let config = sqlite_config(
"sqlite_db",
"./test.db",
pool_config
)?;
add_database(config).await?;
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?;
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?;
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?;
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?;
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采用现代化架构设计:
应用层 → 模型操作 → ODM层 → 消息队列 → 连接池 → 数据库
↑ ↓
└────────────── 结果返回 ←────────────────┘
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.1.9
支持Rust版本: 1.70+
重要更新: v0.1.9 修正项目定位为ODM,完善了跨数据库支持!
本项目采用 LGPL-v3 许可证。
欢迎提交Issue和Pull Request来改进这个项目!
如有问题或建议,请通过以下方式联系: