🦀30分钟掌握 RustRover + Rocket +diesel 异步 Rust Web 项目

3/8/2025

一、开始之前

要开始一个 Rust Web 项目,我们需要一些趁手的工具(编辑器)和库类。这里我们推荐

二、Why Rust Rover ?

Rust Rover 是一个 Rust 的集成开发环境。安装即用,非常方便。一年前写过一篇关于 Rust Rover 的文章: 🦀RustRover, Rust 终于有了自己的专属 IDE,感兴趣的可以看看。相比 VSCode 集成开发环境更加简单直观。

2.1)免费用于非商业用途

非常商业用途免费.png

2.2)支持 Cargo

cargo 支持.png

2.3)数据库支持

数据库支持.png

2.4)AI 能力

AI 能力.png

2.5)插件:汉语支持

中文插件.png

Rust Rover 通过插件支持中文,你可以安装此插件讲界面翻译成中文

你也可以根据自己的需要安装插件,例如:

  • IdeaVim vim 插件,在 RustRover 中体验原汁原味的 vim 味道
  • 其他自己喜欢的主题等等...

良好的代码提示功能

良好的提示.png

三、使用 RustRover 初始化一个项目

虽然你可以使用 cargo 提供 cli 直接创建,但是这里为了编程统一,我们直接使用 RustRover 来创一个项:

创建 Rust 项目.png

四、安装 Rocket + diesel 等异步依赖

依赖.png

需要注意的是 rocket v0.5 已经支持异步特性。我们可以使用异步,提高 Rokect 的异步 IO 能力。

五、数据库操作 diesel

我们使用 diesel + diesel-async + rocket_db_pools 处理数据库操作。因为之前已经全局安装 diesel-cli 这里我们直接数据配置,和迁移工作,接下来需要熟悉一下 dieselcli 功能:

这里默认已经有了 Rust 的开发环境(没有就安装一下),当然就开始之前还需要做一些前置工作:

我们使用 diesel ORM 操作数据库。diesel 有自己的命令行工具,这里简单的了解一下:

操作命令
安装 Diesel CLIcargo install diesel_cli --no-default-features --features postgres
生成迁移目录diesel setup
生成指定名称的迁移文件diesel migration generate <m_name>
运用迁移diesel migration run
回滚并重新运行迁移diesel migration redo
回滚到上一次迁移diesel migration revert
重置数据库diesel database reset

5.1) 数据库配置

数据库地址配置.png

配置有两个配置:

  • 🌷迁移 cli 工具,从 .env 中获取 DATABASE_URL 地址。
  • 🌷Rocket 中的 Rocket.toml 中配置数据库的地址。

在开始之前我们需要 pg 数据库中创建一个数据库 test-demo

5.2)第一次迁移并编写 sql 语句

diesel setup

diesel migration generate "init" # 第一迁移名字

生成迁移文件.png

我们在迁移 sql 文件中添加,post 表和字段。然后执行迁移,将表添加到数据库中:

diesel migration run

我们在 pgAdmin 中查看表生成情况:

在 pgadmin 中查看表.png

数据库创建好之后,我们可以编写 Rust 相关的代码了。

会生一个 schema.rs 文件,包含 sql 中的表:

自动生成 table 表.png

5.3)使用 Rust Rover 数据库功能

rustrover 自带的数据库工具.png

查看 Rust Rover 数据功能的数据库表:

rust-rover 数据库表.png

这个表在后面操作数据库有大用处。做好数据准备工作,我们就可以编写模型文件了。

六、模型

我们就数据表编写模型文件 models.rs

抽象 models.png

模型文件在数据校验,有大作用,也是数据库操作经典文件。

七、将数据库抽象出来

use rocket_db_pools::{Database};
use rocket_db_pools::diesel::{PgPool};

#[derive(Database)]
#[database("my_db")]
pub struct Db(PgPool);

我们使用 rocket_db_pools 将数据抽象出来,然后注入到 Rocket 中并初始化:

#[macro_use] extern crate rocket;

use rocket_db_pools::Database;
use crate::db::Db;

#[launch]
fn rocket() -> _ {
    rocket::build().attach(Db::init()).mount("/", routes![])
}

八、Rocket 路由

有了 数据库 Db, models 和 schema 就可以对接 Rocket 的路由了,这里使用

  • 🌷mount 方法
  • 🌷routes 宏
#[macro_use] extern crate rocket;

use rocket_db_pools::Database;
use crate::db::Db;

mod models;
mod api;
mod db;
mod schema;

#[launch]
fn rocket() -> _ {
    rocket::build().attach(Db::init()).mount("/", routes![
          api::create, 
          api::update, 
          api::delete, 
          api::all
    ])
}

api 单独的抽象出来,然后全部挂在到 / 路由下。

九、实现路由 CRUD

首先导入依赖

use crate::db::Db;
use rocket::serde::{ json::Json};
use crate::schema::posts;
use diesel::prelude::*;
use rocket::response::{Debug};
use rocket_db_pools::{Connection};
use diesel_async::RunQueryDsl;
use rocket::http::Status;
use crate::models::{NewPost, Post};

type Result<T, E = Debug<diesel::result::Error>> = std::result::Result<T, E>;

9.1)获取所有数据

all.png

9.2)创建一条记录

create.png

9.3更新记录

update.png

9.4删除记录

delete.png

十、调试

Rust Rover 调试也非常方便,我们可以直接在需要断点的位置发起调试

debuger 调试.png

十一、接口测试

我们可以直接在 RustRover 中使用 .http 文件进行接口测试,我先看看 http 的特点

11.1).http 的文件的特点

  • 轻量级语法:编写简单、可读性好,可以测试常见的 HTTP 请求(GET、POST、PUT、DELETE 等)。
  • 集成测试:与 IDE 的深度集成,直接在代码编辑器中运行请求。
  • 变量和环境支持:通过变量和环境配置,灵活性高,适合多环境测试。

11.2).http 的基础语法回顾

### 变量
@baseUrl = http://example.com

### 使用变量
GET {{baseUrl}}/api/posts

### get
GET http://example.com/api/posts
Accept: application/json

### post
POST http://example.com/api/posts
Content-Type: application/json
#### post 请求体
{
  "title": "New Post",
  "content": "Content of the post"
}

11.3)一个 GET 请求示例

rust-rover http 文件测试接口.png

十二、代码

十三、小结

本文基于 RustRover + Rocket + diesel 快速开始一个 Rust Rocket 的异步 Web 项目。RustRoverRust 开箱即用,全面支持 Cargo,轻松并开发创建 Rust 项目,类型提示完整。使用 Rust RoverDebuuger 功能可以让你更加专注到业务逻辑的开发。