什么是 CRUD?
CRUD 是指创建(Create)、读取(Read)、更新(Update)和删除(Delete)四种基本的操作。这些操作是任何应用程序的核心功能,特别是在数据库管理、用户管理等方面。
创建项目
首先,我们需要创建一个新的 Rust 项目。打开终端并运行以下命令:
cargo new rust_crud cd rust_crud
这会生成一个基本的 Cargo 项目结构。接下来,我们将在 Cargo.toml 文件中添加所需的依赖项。打开 Cargo.toml 并添加以下内容:
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "mysql"] }
tokio = { version = "1.0", features = ["full"] }这里我们使用了 serde 和 serde_json 来处理 JSON 数据,sqlx 用于与 MySQL 数据库交互,以及 tokio 作为异步运行时。
定义数据模型
我们将定义一个简单的数据模型来表示我们的用户信息。在 src/main.rs 中,我们可以使用 serde 来序列化和反序列化数据。
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]
struct User {
id: Option<i32>,
name: String,
email: String,
}连接数据库
接下来,我们需要连接到 MySQL 数据库。首先,在 src/main.rs 中导入必要的模块,并设置数据库连接。
// www.javascriptcn.com code example
use sqlx::mysql::MySqlPool;
use std::env;
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let pool = MySqlPool::connect(&database_url).await?;
println!("Connected to the database!");
// 其他代码将在这里添加
Ok(())
}确保你已经设置了 DATABASE_URL 环境变量,指向你的 MySQL 数据库。
创建表
为了存储用户信息,我们需要创建一个表。在 src/main.rs 中,我们可以定义一个函数来执行 SQL 语句。
// www.javascriptcn.com code example
async fn create_table(pool: &MySqlPool) -> Result<(), sqlx::Error> {
sqlx::query(
r#"CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
)"#,
)
.execute(pool)
.await?;
Ok(())
}然后在 main 函数中调用这个函数:
// www.javascriptcn.com code example
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let pool = MySqlPool::connect(&database_url).await?;
create_table(&pool).await?;
// 其他代码将在这里添加
Ok(())
}创建用户
现在我们有了一个表,可以开始创建用户了。我们可以定义一个函数来插入新的用户记录。
// www.javascriptcn.com code example
async fn create_user(pool: &MySqlPool, user: User) -> Result<(), sqlx::Error> {
let result = sqlx::query!(
"INSERT INTO users (name, email) VALUES (?, ?)",
user.name,
user.email
)
.execute(pool)
.await?;
user.id = Some(result.last_insert_id() as i32);
Ok(())
}然后在 main 函数中调用这个函数:
// www.javascriptcn.com code example
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let pool = MySqlPool::connect(&database_url).await?;
create_table(&pool).await?;
let user = User {
id: None,
name: "John Doe".to_string(),
email: "john.doe@example.com".to_string(),
};
create_user(&pool, user).await?;
// 其他代码将在这里添加
Ok(())
}读取用户
接下来,我们需要实现读取用户的逻辑。我们可以定义一个函数来从数据库中查询用户。
// www.javascriptcn.com code example
async fn get_user(pool: &MySqlPool, id: i32) -> Result<Option<User>, sqlx::Error> {
let user = sqlx::query_as!(
User,
"SELECT id, name, email FROM users WHERE id = ?",
id
)
.fetch_optional(pool)
.await?;
Ok(user)
}然后在 main 函数中调用这个函数:
// www.javascriptcn.com code example
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let pool = MySqlPool::connect(&database_url).await?;
create_table(&pool).await?;
let user = User {
id: None,
name: "John Doe".to_string(),
email: "john.doe@example.com".to_string(),
};
create_user(&pool, user).await?;
if let Some(user) = get_user(&pool, 1).await? {
println!("User: {:?}", user);
} else {
println!("No user found with ID 1.");
}
// 其他代码将在这里添加
Ok(())
}更新用户
现在我们已经有了创建和读取用户的代码,接下来我们实现更新用户的逻辑。定义一个函数来更新用户信息。
// www.javascriptcn.com code example
async fn update_user(pool: &MySqlPool, user: User) -> Result<(), sqlx::Error> {
sqlx::query!(
"UPDATE users SET name = ?, email = ? WHERE id = ?",
user.name,
user.email,
user.id.unwrap()
)
.execute(pool)
.await?;
Ok(())
}然后在 main 函数中调用这个函数:
// www.javascriptcn.com code example
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let pool = MySqlPool::connect(&database_url).await?;
create_table(&pool).await?;
let mut user = User {
id: None,
name: "John Doe".to_string(),
email: "john.doe@example.com".to_string(),
};
create_user(&pool, user.clone()).await?;
if let Some(mut user) = get_user(&pool, 1).await? {
user.name = "Jane Doe".to_string();
user.email = "jane.doe@example.com".to_string();
update_user(&pool, user).await?;
}
// 其他代码将在这里添加
Ok(())
}删除用户
最后,我们需要实现删除用户的逻辑。定义一个函数来删除用户。
async fn delete_user(pool: &MySqlPool, id: i32) -> Result<(), sqlx::Error> {
sqlx::query!("DELETE FROM users WHERE id = ?", id)
.execute(pool)
.await?;
Ok(())
}然后在 main 函数中调用这个函数:
// www.javascriptcn.com code example
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let pool = MySqlPool::connect(&database_url).await?;
create_table(&pool).await?;
let user = User {
id: None,
name: "John Doe".to_string(),
email: "john.doe@example.com".to_string(),
};
create_user(&pool, user.clone()).await?;
delete_user(&pool, 1).await?;
// 其他代码将在这里添加
Ok(())
}总结
通过以上步骤,我们已经实现了基本的 CRUD 操作。你可以根据需要扩展这个示例,例如增加更多的错误处理、日志记录等功能。希望这个教程对你有所帮助!