1use torm::{Database, DBDriver, Dsn, Model, Query, QueryBuilder};
2use chrono::Utc;
3use serde::{Deserialize, Serialize};
4
5#[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 println!("📡 数据库连接示例");
21 println!("========================");
22 demonstrate_database_connection().await?;
23 println!();
24
25 println!("SQLite 连接示例");
27 println!("========================");
28 demonstrate_database_file_connection().await?;
29 println!();
30
31 println!("🔨 查询构建器示例");
33 println!("========================");
34 demonstrate_query_builder();
35 println!();
36
37 println!("🔍 高级查询示例");
39 println!("========================");
40 demonstrate_advanced_queries();
41 println!();
42
43 println!("💾 CRUD 操作示例");
45 println!("========================");
46 demonstrate_crud_operations().await?;
47 println!();
48
49 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#[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 database.ping().await?;
162 println!(" ✅ Ping 成功");
163
164 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 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 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 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 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 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 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 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 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 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 user.before_save()?;
333 println!(" 用户: {:?}", user);
334 println!(" ID: {:?}", user.id());
335 println!(" 创建时间: {:?}", user.created_at());
336
337 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 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}