Rust + Rocket + Diesel 构建高性能 CRUD API 全程指南

作者:API传播员 · 2025-11-02 · 阅读时间:6分钟
本教程详细介绍了如何使用Rust的Rocket框架和Diesel ORM构建支持CRUD操作的REST API。内容包括数据库配置、迁移文件生成以及实现POST、GET、PUT和DELETE请求的具体代码示例,帮助开发者快速掌握高性能API开发技巧。

一、背景与优势

Rust 在后端开发领域是一位强有力的竞争者,以其对速度、内存安全和并发性的重视而闻名。本教程将带您使用 Rocket 框架和 Diesel ORM 构建一个支持完整 CRUDREST API,并实现生产级的数据库交互、JSON 序列化与错误处理。


二、前置条件

  1. 熟悉 Rust 并安装 cargo
  2. 了解 HTTP 请求与 REST 概念
  3. 已安装 SQLite(或 PostgreSQL)

💡 AI 助攻
想自动生成带注释的 Cargo.toml?用「代码生成」提示词,30 秒即可拿到模板,再交给「代码优化」砍掉冗余特性,编译速度提升 20%!


三、项目初始化与依赖配置

cargo new rust-rocket-diesel && cd $_
cargo add diesel --features sqlite
cargo add rocket rocket_contrib rocket_codegen
cargo add serde serde_json serde_derive
cargo add dotenv

Cargo.toml 关键片段:

[dependencies]
diesel = { version = "1.4.5", features = ["sqlite"] }
rocket = "0.4.11"
rocket_contrib = "0.4.11"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
dotenv = "0.15.0"

四、Diesel 数据库设置

1. 安装 CLI 并初始化

cargo install diesel_cli --no-default-features --features sqlite
echo "DATABASE_URL=database.db" > .env
diesel setup

2. 创建迁移

diesel migration generate create_students

migrations/xxxx_create_students/up.sql:

CREATE TABLE students (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  age INTEGER NOT NULL
);

down.sql:

DROP TABLE students;

3. 应用迁移

diesel migration run
# 自动生成 src/schema.rs

五、定义模型与路由

1. 模型与 JSON 映射

use serde::{Deserialize, Serialize};
use diesel::prelude::*;

#[derive(Serialize, Deserialize, Queryable, Insertable, AsChangeset)]
#[table_name = "students"]
pub struct Student {
    pub id: Option<i32>,
    pub name: String,
    pub age: i32,
}

2. Rocket 数据库连接池

use rocket_contrib::databases::diesel::SqliteConnection;
use rocket::http::Status;
use rocket::response::status;
use rocket::Json;

#[database("sqlite_db")]
pub struct DbConn(SqliteConnection);

六、CRUD 端点实现

1. POST /student —— 创建学生

#[post("/student", format = "json", data = "<new_student>")]
fn create_student(
    new_student: Json<Student>,
    conn: DbConn,
) -> Result<Json<Value>, Status> {
    conn.run(|c| {
        diesel::insert_into(students::table)
            .values(&new_student.into_inner())
            .execute(c)
            .map_err(|_| Status::InternalServerError)?;
        Ok(json!({ "status": "success" }))
    })
}

2. GET /students —— 查询全部

#[get("/students")]
fn get_students(conn: DbConn) -> Result<Json<Value>, Status> {
    conn.run(|c| {
        let results = students::table
            .load::<Student>(c)
            .map_err(|_| Status::InternalServerError)?;
        Ok(Json(json!(results)))
    })
}

3. PUT /students/ —— 更新

#[put("/students/<id>", format = "json", data = "<update>")]
fn update_student(
    id: i32,
    update: Json<Student>,
    conn: DbConn,
) -> Result<Json<Value>, Status> {
    conn.run(|c| {
        diesel::update(students::table.find(id)))
            .set(&update.into_inner())
            .execute(c)
            .map_err(|_| Status::InternalServerError)?;
        Ok(json!({ "status": "success", "updated_id": id }))
    })
}

4. DELETE /students/ —— 删除

#[delete("/students/<id>")]
fn delete_student(id: i32, conn: DbConn) -> Result<Json<Value>, Status> {
    conn.run(|c| {
        diesel::delete(students::table.find(id)))
            .execute(c)
            .map_err(|_| Status::InternalServerError)?;
        Ok(json!({ "status": "success", "deleted_id": id }))
    })
}

🔍 AI 审查
把「Diesel 查询错误处理」提交评审?「代码审查助手」可自动检查连接池泄露、SQL 注入风险,提前发现 80% 潜在 Bug!


七、启动与测试

1. 运行服务

cargo run
# 默认监听 localhost:8000

2. 快速验证(curl)

# 新增学生
curl -X POST localhost:8000/student \
  -H "Content-Type: application/json" \
  -d '{"name":"Alice","age":20}'

# 查询全部
curl localhost:8000/students

# 更新
curl -X PUT localhost:8000/students/1 \
  -H "Content-Type: application/json" \
  -d '{"name":"Alice","age":21}'

# 删除
curl -X DELETE localhost:8000/students/1

AI 补救
把「curl 测试命令」写进 README 太麻烦?用「代码文档生成器」提示词,自动在函数头部生成标准注释,提醒后续接入 Postman 集合,文档一键达标!


八、进阶路线图

阶段 技术点 工具/库
① 认证 JWT + Rocket 中间件 rocket-jwt
② 分页 limit/offset 查询 diesel-pagination
③ 日志 结构化日志 tracing
④ 容器化 多阶段构建 Docker
⑤ CI/CD GitHub Actions cargo test + clippy

九、总结与下一步

通过本教程,您已学会:

  • 使用 Rocket 定义 REST 端点
  • 使用 Diesel 进行类型安全的 CRUD
  • JSON 自动序列化/反序列化
  • 连接池与错误处理最佳实践

下一步可在此基础上添加认证、分页、OpenAPI 文档等功能,打造生产级后端。祝编码愉快!

今晚就 push 到 GitHub,明天就能用 Fly.io 一键部署!🚀


原文链接: https://earthly.dev/blog/rust-api-rocket-diesel/