use rat_logger::{LoggerBuilder, debug, handler::term::TermConfig, info, warn};
use rat_quickdb::manager::{drop_table, shutdown, table_exists};
use rat_quickdb::types::{DataValue, QueryCondition, QueryOperator};
use rat_quickdb::*;
use rat_quickdb::{ModelOperations, boolean_field, datetime_field, integer_field, string_field};
use std::collections::HashMap;
define_model! {
struct ManualTableTest {
id: String,
name: String,
email: Option<String>,
age: i32,
is_active: bool,
created_at: chrono::DateTime<chrono::Utc>,
}
collection = "manual_table_test",
fields = {
id: string_field(None, None, None).required().unique(),
name: string_field(Some(100), Some(1), None).required(),
email: string_field(Some(255), Some(5), None),
age: integer_field(Some(0), Some(150)),
is_active: boolean_field(),
created_at: datetime_field().required(),
}
indexes = [
{ fields: ["email"], unique: true, name: "idx_email" },
{ fields: ["name"], unique: false, name: "idx_name" },
{ fields: ["name", "age"], unique: false, name: "idx_name_age" },
],
}
#[tokio::main]
async fn main() -> QuickDbResult<()> {
LoggerBuilder::new()
.add_terminal_with_config(TermConfig::default())
.init()
.expect("日志初始化失败");
rat_quickdb::init();
println!("=== PostgreSQL 手动表管理示例 ===");
let config = DatabaseConfig {
db_type: DatabaseType::PostgreSQL,
connection: ConnectionConfig::PostgreSQL {
host: "172.16.0.96".to_string(),
port: 5432,
database: "testdb".to_string(),
username: "testdb".to_string(),
password: "testdb123456".to_string(),
ssl_mode: Some("prefer".to_string()),
tls_config: None,
},
pool: PoolConfig::builder()
.max_connections(10)
.min_connections(2)
.connection_timeout(30)
.idle_timeout(300)
.max_lifetime(1800)
.max_retries(3)
.retry_interval_ms(1000)
.keepalive_interval_sec(60)
.health_check_timeout_sec(10)
.build()
.unwrap(),
alias: "default".to_string(),
cache: None,
id_strategy: IdStrategy::Uuid,
};
add_database(config).await?;
set_default_alias("default").await?;
println!("\n=== 开始手动表管理演示 ===\n");
println!("1. 清理旧的测试表(如果存在)");
match drop_table("default", "manual_table_test").await {
Ok(_) => println!(" ✅ 清理完成"),
Err(e) => {
println!(" ⚠️ 清理失败(可能表不存在): {}", e);
}
}
println!("\n2. 检查测试表是否存在");
match table_exists("default", "manual_table_test").await {
Ok(exists) => {
if !exists {
println!(" ✅ 测试表不存在,符合预期");
} else {
println!(" ⚠️ 测试表已存在");
}
}
Err(e) => {
println!(" ❌ 检查表存在性失败: {}", e);
return Err(e);
}
}
println!("\n3. 通过模型管理器直接创建表");
match ModelManager::<ManualTableTest>::create_table().await {
Ok(_) => {
println!(" ✅ 通过模型管理器创建表成功");
}
Err(e) => {
println!(" ❌ 通过模型管理器创建表失败: {}", e);
return Err(e);
}
}
println!("\n4. 验证表已成功创建");
match table_exists("default", "manual_table_test").await {
Ok(exists) => {
if exists {
println!(" ✅ 表创建成功并已验证");
} else {
println!(" ❌ 表创建失败");
return Err(QuickDbError::QueryError {
message: "表创建验证失败".to_string(),
});
}
}
Err(e) => {
println!(" ❌ 验证表存在性失败: {}", e);
return Err(e);
}
}
println!("\n5. 测试表的基本操作");
let test_records = vec![
ManualTableTest {
id: String::new(),
name: "另一个用户".to_string(),
email: Some("another@example.com".to_string()),
age: 30,
is_active: false,
created_at: chrono::Utc::now(),
},
ManualTableTest {
id: String::new(),
name: "第三个用户".to_string(),
email: None, age: 18,
is_active: true,
created_at: chrono::Utc::now(),
},
];
for (i, record) in test_records.into_iter().enumerate() {
match record.save().await {
Ok(result) => {
println!(" ✅ 测试数据 {} 插入成功: {}", i + 1, result);
}
Err(e) => {
println!(" ❌ 测试数据 {} 插入失败: {}", i + 1, e);
}
}
}
println!("\n6. 查询测试数据");
match ModelManager::<ManualTableTest>::find(vec![], None).await {
Ok(records) => {
if records.is_empty() {
println!(" ❌ 查询失败:预期有数据但返回0条记录!");
return Err(QuickDbError::QueryError {
message: "查询失败:预期有数据但返回0条记录".to_string(),
});
} else {
println!(" ✅ 查询成功,共找到 {} 条记录", records.len());
for record in &records {
println!(
" - ID: {}, 姓名: {}, 邮箱: {:?}, 年龄: {}, 激活: {}",
record.id, record.name, record.email, record.age, record.is_active
);
}
}
}
Err(e) => {
println!(" ❌ 查询失败: {}", e);
return Err(e);
}
}
println!("\n7. 手动删除表");
match drop_table("default", "manual_table_test").await {
Ok(_) => println!(" ✅ 表删除成功"),
Err(e) => {
println!(" ❌ 表删除失败: {}", e);
return Err(e);
}
}
println!("\n8. 确认表已删除");
match table_exists("default", "manual_table_test").await {
Ok(exists) => {
if !exists {
println!(" ✅ 确认表已成功删除");
} else {
println!(" ❌ 表仍然存在,删除失败");
return Err(QuickDbError::QueryError {
message: "表删除验证失败".to_string(),
});
}
}
Err(e) => {
println!(" ❌ 确认表存在性失败: {}", e);
return Err(e);
}
}
println!("\n9. 验证表已无法操作");
match ModelManager::<ManualTableTest>::find(vec![], None).await {
Ok(records) => {
if records.is_empty() {
println!(" ✅ 确认表已无法操作(返回0条记录,符合预期)");
} else {
println!(
" ⚠️ 意外:仍然可以查询已删除的表,找到 {} 条记录",
records.len()
);
}
}
Err(e) => {
println!(" ✅ 确认表已无法操作(符合预期): {}", e);
}
}
println!("\n=== 手动表管理演示完成 ===");
println!("✅ 所有手动表管理操作演示成功");
println!("✅ 遵循了框架的模型宏设计原则");
println!("✅ 展示了表存在性检查和直接表管理操作");
println!("✅ 使用了ModelManager::<T>::create_table()直接创建表");
shutdown().await?;
Ok(())
}