一、开始之前
要开始一个 Rust Web 项目,我们需要一些趁手的工具(编辑器)和库类。这里我们推荐
- 🌷Rust Rover 作为
编辑器
- 🌷Rocket 作为
Web
框架 - 🌷Diesel 作为
ORM
操作
二、Why Rust Rover ?
Rust Rover
是一个 Rust
的集成开发环境。安装即用,非常方便。一年前写过一篇关于 Rust Rover
的文章: 🦀RustRover, Rust 终于有了自己的专属 IDE,感兴趣的可以看看。相比 VSCode 集成开发环境更加简单直观。
2.1)免费用于非商业用途
2.2)支持 Cargo
2.3)数据库支持
2.4)AI 能力
2.5)插件:汉语支持
Rust Rover 通过插件支持中文,你可以安装此插件讲界面翻译成中文
你也可以根据自己的需要安装插件,例如:
IdeaVim vim
插件,在 RustRover 中体验原汁原味的 vim 味道- 其他自己喜欢的主题等等...
良好的代码提示功能
三、使用 RustRover 初始化一个项目
虽然你可以使用 cargo 提供 cli 直接创建,但是这里为了编程统一,我们直接使用 RustRover 来创一个项:
四、安装 Rocket + diesel 等异步依赖
需要注意的是 rocket v0.5
已经支持异步特性。我们可以使用异步,提高 Rokect
的异步 IO
能力。
五、数据库操作 diesel
我们使用 diesel
+ diesel-async
+ rocket_db_pools
处理数据库操作。因为之前已经全局安装 diesel-cli
这里我们直接数据配置,和迁移工作,接下来需要熟悉一下 diesel
的 cli
功能:
这里默认已经有了 Rust 的开发环境(没有就安装一下),当然就开始之前还需要做一些前置工作:
我们使用 diesel ORM 操作数据库。diesel 有自己的命令行工具,这里简单的了解一下:
操作 | 命令 |
---|---|
安装 Diesel CLI | cargo 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) 数据库配置
配置有两个配置:
- 🌷迁移
cli
工具,从.env
中获取 DATABASE_URL 地址。 - 🌷
Rocket
中的Rocket.toml
中配置数据库的地址。
在开始之前我们需要 pg 数据库中创建一个数据库 test-demo
5.2)第一次迁移并编写 sql 语句
sh
diesel setup
diesel migration generate "init" # 第一迁移名字
我们在迁移 sql 文件中添加,post 表和字段。然后执行迁移,将表添加到数据库中:
sh
diesel migration run
我们在 pgAdmin 中查看表生成情况:
数据库创建好之后,我们可以编写 Rust 相关的代码了。
会生一个 schema.rs 文件,包含 sql 中的表:
5.3)使用 Rust Rover 数据库功能
查看 Rust Rover 数据功能的数据库表:
这个表在后面操作数据库有大用处。做好数据准备工作,我们就可以编写模型文件了。
六、模型
我们就数据表编写模型文件 models.rs
:
模型文件在数据校验,有大作用,也是数据库操作经典文件。
七、将数据库抽象出来
rs
use rocket_db_pools::{Database};
use rocket_db_pools::diesel::{PgPool};
#[derive(Database)]
#[database("my_db")]
pub struct Db(PgPool);
我们使用 rocket_db_pools 将数据抽象出来,然后注入到 Rocket 中并初始化:
rs
#[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 宏
ts
#[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
首先导入依赖
rs
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)获取所有数据
9.2)创建一条记录
9.3更新记录
9.4删除记录
十、调试
Rust Rover 调试也非常方便,我们可以直接在需要断点的位置发起调试
十一、接口测试
11.1)RostRover HTTP 测试文件测试接口
在 Rost Rover 新建一个 HTTP 文件,然后发送请求。
11.2)Postman
借助 Postman 你可以做更加专业的测试:
十二、代码
- 🌷rocket-async 源码开源,感兴趣的小伙伴可以看一下。
十三、小结
本文基于 RustRover
+ Rocket
+ diesel
快速开始一个 Rust Rocket
的异步 Web
项目。RustRover
对 Rust
开箱即用,全面支持 Cargo
,轻松并开发创建 Rust
项目,类型提示完整。使用 Rust Rover
的 Debuuger
功能可以让你更加专注到业务逻辑的开发。