Skip to main content

complete_demo/
complete_demo.rs

1use torm::{Database, DBDriver, Dsn, Model, Query, QueryBuilder};
2use chrono::Utc;
3use serde::{Deserialize, Serialize};
4
5/// 文件持久化演示用的模型:`#[derive(Model)]` 自动生成 schema 与字段映射。
6#[derive(Debug, Clone, Model)]
7#[model(table_name = "users")]
8pub struct DemoUser {
9    pub id: i64,
10    pub name: String,
11    pub age: i32,
12}
13
14#[tokio::main]
15async fn main() -> Result<(), Box<dyn std::error::Error>> {
16    println!("🚀 TORM - Tokio ORM 示例演示\n");
17
18     
19    // 1. 数据库连接示例
20    println!("📡 数据库连接示例");
21    println!("========================");
22    demonstrate_database_connection().await?;
23    println!();
24
25    // 1.1 SQLite 文件 连接示例
26    println!("SQLite 连接示例");
27    println!("========================");
28    demonstrate_database_file_connection().await?;
29    println!();
30
31    // 2. 查询构建器示例
32    println!("🔨 查询构建器示例");
33    println!("========================");
34    demonstrate_query_builder();
35    println!();
36
37    // 3. 高级查询示例
38    println!("🔍 高级查询示例");
39    println!("========================");
40    demonstrate_advanced_queries();
41    println!();
42
43    // 4. CRUD 操作示例
44    println!("💾 CRUD 操作示例");
45    println!("========================");
46    demonstrate_crud_operations().await?;
47    println!();
48
49    // 5. 事务示例
50    println!("🔄 事务操作示例");
51    println!("========================");
52    demonstrate_transactions();
53    println!();
54
55    println!("🎉 所有示例演示完成!");
56    println!();
57    println!("📚 TORM 特性总结:");
58    println!("  ✅ 多数据库支持 (MySQL, PostgreSQL, SQLite)");
59    println!("  ✅ 异步/await 操作");
60    println!("  ✅ 流畅的查询构建器API");
61    println!("  ✅ 模型 trait 和自动时间戳管理");
62    println!("  ✅ 事务支持");
63    println!("  ✅ 复杂查询和分页");
64    println!("  ✅ 生命周期钩子");
65
66    Ok(())
67}
68
69// 示例模型结构
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct User {
72    pub id: String,
73    pub name: String,
74    pub email: String,
75    pub age: Option<i32>,
76    pub status: String,
77    pub timestamps: torm::orm::model::Timestamps,
78}
79
80impl User {
81    pub fn new(name: &str, email: &str) -> Self {
82        Self {
83            id: String::new(),
84            name: name.to_string(),
85            email: email.to_string(),
86            age: None,
87            status: "active".to_string(),
88            timestamps: torm::orm::model::Timestamps::new(),
89        }
90    }
91
92    pub fn with_age(mut self, age: i32) -> Self {
93        self.age = Some(age);
94        self
95    }
96
97    pub fn with_status(mut self, status: &str) -> Self {
98        self.status = status.to_string();
99        self
100    }
101
102    pub fn with_id(mut self, id: String) -> Self {
103        self.id = id;
104        self
105    }
106}
107
108#[async_trait::async_trait]
109impl Model for User {
110    fn table_name() -> &'static str {
111        "users"
112    }
113
114    fn id(&self) -> Option<String> {
115        if self.id.is_empty() {
116            None
117        } else {
118            Some(self.id.clone())
119        }
120    }
121
122    fn set_id(&mut self, id: String) {
123        self.id = id;
124    }
125
126    fn created_at(&self) -> Option<chrono::DateTime<Utc>> {
127        self.timestamps.created_at
128    }
129
130    fn updated_at(&self) -> Option<chrono::DateTime<Utc>> {
131        self.timestamps.updated_at
132    }
133
134    fn deleted_at(&self) -> Option<chrono::DateTime<Utc>> {
135        self.timestamps.deleted_at
136    }
137
138    fn set_created_at(&mut self, timestamp: chrono::DateTime<Utc>) {
139        self.timestamps.created_at = Some(timestamp);
140    }
141
142    fn set_updated_at(&mut self, timestamp: chrono::DateTime<Utc>) {
143        self.timestamps.updated_at = Some(timestamp);
144    }
145
146    fn set_deleted_at(&mut self, timestamp: Option<chrono::DateTime<Utc>>) {
147        self.timestamps.deleted_at = timestamp;
148    }
149}
150
151async fn demonstrate_database_file_connection() -> Result<(), Box<dyn std::error::Error>> {
152    println!("SQLite 连接:");
153    let dsn = Dsn::new(DBDriver::SQLite, "target/demo.db");
154    println!("  DSN: {}", dsn.build());
155    
156    let database = Database::sqlite("target/demo.db").await?;
157    println!("  ✅ 连接成功");
158    println!("  驱动: {:?}", database.db_type());
159    
160    // 测试连接
161    database.ping().await?;
162    println!("  ✅ Ping 成功");
163
164    // 依据模型自动建表并执行 CRUD,触发文件写入(零 SqlValue)
165    database.auto_migrate::<DemoUser>().await?;
166    println!("  ✅ 创建表成功(依据模型 schema)");
167
168    let mut users = vec![
169        DemoUser { id: 0, name: "Alice".into(), age: 25 },
170        DemoUser { id: 0, name: "Bob".into(), age: 30 },
171    ];
172    for u in &mut users {
173        database.create(u).await?;
174    }
175    println!("  ✅ 插入数据成功");
176
177    let all: Vec<DemoUser> = database.all::<DemoUser>().await?;
178    println!("  ✅ 查询返回 {} 行", all.len());
179
180    database.close().await?;
181    println!("  ✅ 数据库已关闭,数据已保存到 demo.db");
182    
183    println!();
184    println!("MySQL 连接示例:");
185    let mysql_dsn = Dsn::new(DBDriver::MySQL, "mydb")
186        .with_host("localhost")
187        .with_port(3306)
188        .with_username("user")
189        .with_password("password");
190    println!("  DSN: {}", mysql_dsn.build());
191    
192    println!();
193    println!("PostgreSQL 连接示例:");
194    let pg_dsn = Dsn::new(DBDriver::PostgreSQL, "mydb")
195        .with_host("localhost")
196        .with_port(5432)
197        .with_username("user")
198        .with_password("password");
199    println!("  DSN: {}", pg_dsn.build());
200
201    Ok(())
202}
203
204async fn demonstrate_database_connection() -> Result<(), Box<dyn std::error::Error>> {
205    println!("SQLite 连接:");
206    let dsn = Dsn::new(DBDriver::SQLite, "demo.db");
207    println!("  DSN: {}", dsn.build());
208    
209    let database = Database::sqlite(":memory:").await?;
210    println!("  ✅ 连接成功");
211    println!("  驱动: {:?}", database.db_type());
212    
213    // 测试连接
214    database.ping().await?;
215    println!("  ✅ Ping 成功");
216    database.close().await?;
217    
218    println!();
219    println!("MySQL 连接示例:");
220    let mysql_dsn = Dsn::new(DBDriver::MySQL, "mydb")
221        .with_host("localhost")
222        .with_port(3306)
223        .with_username("user")
224        .with_password("password");
225    println!("  DSN: {}", mysql_dsn.build());
226    
227    println!();
228    println!("PostgreSQL 连接示例:");
229    let pg_dsn = Dsn::new(DBDriver::PostgreSQL, "mydb")
230        .with_host("localhost")
231        .with_port(5432)
232        .with_username("user")
233        .with_password("password");
234    println!("  DSN: {}", pg_dsn.build());
235
236    Ok(())
237}
238
239fn demonstrate_query_builder() {
240    // 基本查询
241    let (sql, bindings) = QueryBuilder::new("users")
242        .where_eq("email", "john@example.com")
243        .limit(1)
244        .build();
245    println!("基本查询:");
246    println!("  SQL: {}", sql);
247    println!("  Bindings: {:?}", bindings);
248
249    // 复杂查询
250    let (sql, bindings) = QueryBuilder::new("users")
251        .where_eq("status", "active")
252        .where_gt("age", "18")
253        .where_like("name", "John%")
254        .order_by("created_at", "DESC")
255        .limit(10)
256        .offset(5)
257        .build();
258    println!();
259    println!("复杂查询:");
260    println!("  SQL: {}", sql);
261    println!("  Bindings: {:?}", bindings);
262
263    // IN 查询
264    let (sql, bindings) = QueryBuilder::new("users")
265        .where_in("id", vec![1, 2, 3])
266        .build();
267    println!();
268    println!("IN 查询:");
269    println!("  SQL: {}", sql);
270    println!("  Bindings: {:?}", bindings);
271
272    // BETWEEN 查询
273    let (sql, bindings) = QueryBuilder::new("users")
274        .where_between("age", 18, 65)
275        .build();
276    println!();
277    println!("BETWEEN 查询:");
278    println!("  SQL: {}", sql);
279    println!("  Bindings: {:?}", bindings);
280}
281
282fn demonstrate_advanced_queries() {
283    // 分页查询
284    let (sql, bindings) = Query::new("users").paginate(2, 10).build().return_sql();
285    println!("分页查询 (第2页,每页10条):");
286    println!("  SQL: {}", sql);
287    println!("  Bindings: {:?}", bindings);
288
289    // 多条件查询
290    let (sql, bindings) = Query::new("users")
291        .where_eq("status", "active")
292        .where_gt("age", "18")
293        .where_like("name", "John%")
294        .where_null("deleted_at")
295        .order_by_desc("created_at")
296        .limit(20)
297        .build()
298        .return_sql();
299    println!();
300    println!("多条件查询:");
301    println!("  SQL: {}", sql);
302    println!("  Bindings: {:?}", bindings);
303
304    // 计数查询
305    let (sql, bindings) = Query::new("users")
306        .where_eq("status", "active")
307        .where_null("deleted_at")
308        .count()
309        .return_sql();
310    println!();
311    println!("计数查询:");
312    println!("  SQL: {}", sql);
313    println!("  Bindings: {:?}", bindings);
314
315    // 通过 return_sql() 查看最近一次操作的 SQL 与参数
316    // (INSERT/UPDATE/DELETE 在直接执行时同样会记录,可用 return_sql() 查看)
317    let q = Query::new("users").where_eq("id", "123").where_gt("age", 18);
318    let (sql, bindings) = q.build().return_sql();
319    println!();
320    println!("查看最近操作的 SQL (return_sql):");
321    println!("  SQL: {}", sql);
322    println!("  Bindings: {:?}", bindings);
323}
324
325async fn demonstrate_crud_operations() -> Result<(), Box<dyn std::error::Error>> {
326    println!("创建用户:");
327    let mut user = User::new("张三", "zhangsan@example.com")
328        .with_age(25)
329        .with_status("active");
330    
331    // 调用生命周期钩子(同步版本)
332    user.before_save()?;
333    println!("  用户: {:?}", user);
334    println!("  ID: {:?}", user.id());
335    println!("  创建时间: {:?}", user.created_at());
336    
337    // 更新用户
338    println!();
339    println!("更新用户:");
340    let mut updated_user = user.with_age(26).with_status("verified");
341    updated_user.before_update()?;
342    println!("  更新后的用户: {:?}", updated_user);
343    
344    // 软删除示例
345    println!();
346    println!("软删除用户:");
347    let mut deleted_user = updated_user;
348    let now = Utc::now();
349    deleted_user.set_deleted_at(Some(now));
350    println!("  是否已删除: {}", deleted_user.is_deleted());
351    println!("  删除时间: {:?}", deleted_user.deleted_at());
352
353    Ok(())
354}
355
356fn demonstrate_transactions() {
357    println!("TORM 事务支持:");
358    println!("  ✅ begin_transaction() - 开始事务");
359    println!("  ✅ commit() - 提交事务");
360    println!("  ✅ rollback() - 回滚事务");
361    println!("  ✅ transaction() - 自动事务管理");
362    println!();
363    println!("示例:");
364    let example_code = r#"
365// 自动事务示例
366let result = database.transaction(|tx| async move {
367    // 执行多个操作
368    let result1 = some_operation(&tx).await?;
369    let result2 = another_operation(&tx).await?;
370    
371    // 如果所有操作成功,自动提交
372    Ok((result1, result2))
373}).await?;
374
375// 如果任何操作失败,自动回滚
376"#;
377    println!("{}", example_code);
378}