前置条件

  • 本机已经安装好 Rust 开发环境
  • 本机 VsCode 已经安装好开发插件

创建工程 web-hook-rs

cargo new web-hook-rs

cd web-hook-rs

添加依赖

编辑 Cargo.toml 文件并添加项目依赖:

[package]
name = "web-hook-rs"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
# 快速的 Web Api 框架
rocket = { version = "0.5.0", features = ["json"] }
# 读取配置信息工具包
config = "0.14.0"
# 数据库 ORM,支持 mysql
diesel = { version = "2.1.0", features = ["mysql", "chrono"] }
# 读取 .env 配置工具包
dotenvy = "0.15"
# 时间管理工具包
chrono = { version = "0.4.24", features = ["serde"] }

编辑后保存,使用如下命令更新依赖:

cargo update

安装 diesel

diesel 是 Rust 常用的ORM工具。 我习惯使用 ORM 工具进行数据库的操作与管理。 接下来,将 Diesel 添加到项目中。Diesel 提供了一个 CLI 来帮助管理应用程序的数据库相关方面。建议在系统上安装它,可以使用以下命令执行此操作:

cargo install diesel_cli --no-default-features --features mysql

这使得 diesel 可执行文件在整个系统中可用。

配置数据库

将 Diesel 添加到项目中后,可以添加数据库连接参数。为此,在项目的根目录下创建 .env 的新文件,并按如下方式更新它:

# 设置你的mysql数据库链接
DATABASE_URL=mysql://root:my_password@localhost/blog

接下来,使用以下命令设置 Diesel。

diesel setup

此命令连接到指定的 URL(位于 .env 文件中),创建数据库(如果以前不存在的话),并添加一个名为 __diesel_schema_migrations 的新表,该表用于跟踪迁移。您可以从数据库查看工具内确认此更改。

接下来,创建迁移以创建鸟类表以及包含一些鸟类 seed 的表。使用以下命令创建迁移。

diesel migration generate create_birds

Diesel CLI 将为我们创建两个 SQL 文件,可以在 migrations 文件夹中找到。你将看到如下所示的输出:

You'll see output that looks something like this:
Creating migrations/2024-04-15-164154_create_birds/up.sql
Creating migrations/2024-04-15-164154_create_birds/down.sql

应用迁移时,将运行 中 up.sql 的命令。要撤消(还原) up.sql 命令所做的更改,可以调用 down.sql 的命令。 将以下内容添加到 up.sql .

CREATE TABLE bird (
	id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
	name VARCHAR(255) NOT NULL,
	scientific_name VARCHAR(255) NOT NULL,
	commonwealth_status VARCHAR(255) NOT NULL
);

INSERT INTO bird (name, scientific_name, commonwealth_status) VALUES
("Black-eared Miner", "Manorina melanotis", "Critically Endangered"),
("Eastern Bristlebird", "Dasyornis brachypterus", "Endangered"),
("Swift Parrot", "Lathamus discolor", "Endangered"),
("Australasian Bittern", "Botaurus poiciloptilus", "Endangered"),
("Southern Giant Petrel", "Macronectes giganteus", "Endangered"),
("Star Finch (eastern), Star Finch (southern)", "Neochmia ruficauda ruficauda", "Endangered"),
("Gould's Petrel", "Pterodroma leucoptera leucoptera", "Endangered"),
("Mallee Emu-wren", "Stipiturus mallee", "Endangered"),
("Coxen's Fig-Parrot", "Cyclopsitta diophthalma coxeni", "Critically Endangered"),
("Black-throated Finch (southern)", "Poephila cincta cincta", "Endangered"),
("Chatham Albatross", "Thalassarche eremita", "Endangered"),
("Grey Grasswren (Bulloo)", "Amytornis barbatus barbatus", "Endangered"),
("Australian Painted Snipe", "Rostratula australis", "Endangered"),
("Amsterdam Albatross", "Diomedea exulans amsterdamensis", "Endangered"),
("Northern Royal Albatross", "Diomedea epomophora sanfordi", "Endangered"),
("Tristan Albatross", "Diomedea exulans exulans", "Endangered");

down.sql 中,添加一个命令来删除 bird 表,如下所示。

DROP TABLE bird;

接下来,运行 Diesel 的命令以执行 up.sql 进行迁移。

diesel migration run

迁移运行后,您可以从 数据库工具内检查 bird 这张表是否已添加到数据库中。

集成编写代码

要完成数据库和 Rust 应用程序之间的集成,请更新应用程序以从终端加载数据库中的鸟类列表。首先编写一个函数以建立与数据库的连接。在您的 src 文件夹中,请创建一个名为 database.rs 的新文件,并添加以下代码。

use std::env;

use diesel::prelude::*;
use dotenvy::dotenv;

pub fn establish_connection() -> MysqlConnection {
    dotenv().ok();

    let database_url = env::var("DATABASE_URL")
        .expect("DATABASE_URL must be set");

    MysqlConnection::establish(&database_url)
        .unwrap_or_else(|_| panic!("Error connecting to {}", database_url))
}

使用前面声明的环境变量,将建立新连接并返回,以便在应用程序中的其他位置使用。

接下来,创建一个结构体以在应用程序中对 a Bird 进行建模。在文件夹中 src ,创建一个名为 models.rs 的新文件,并添加以下代码。

use diesel::prelude::Queryable;
use rocket::serde::Serialize;

#[derive(Serialize, Queryable)]
#[serde(crate = "rocket::serde")]
pub struct Bird {
    pub id: i32,
    pub name: String,
    pub scientific_name: String,
    pub commonwealth_status: String,
}

使用 Queryable 特征假定结构上的字段顺序与关联表中的列匹配,因此请确保按照文件中显示的 src/schema.rs 顺序定义它们。该 src/schema 文件由 Diesel 自动生成。

该 Serialize 特征允许 Rocket 将 Bird 结构序列化为 JSON 对象。

接下来,更新 src/main.rs 以匹配以下内容。

#[macro_use]
extern crate rocket;

use diesel::prelude::*;
use rocket::{Build, Rocket};
use rocket::serde::json::Json;

use self::models::*;
use self::schema::bird::dsl::*;

mod database;
mod models;
mod schema;

#[get("/")]
fn index() -> Json<Vec<Bird>> {
    let connection = &mut database::establish_connection();
    bird.load::<Bird>(connection).map(Json).expect("Error loading birds")
}

#[launch]
fn rocket() -> Rocket<Build> {
    rocket::build().mount("/", routes![index])
}

该 main 函数与数据库建立连接,查询数据库中的鸟类,并以 JSON 响应返回结果。

使用以下命令再次运行应用程序以查看结果。

cargo run 

默认情况下,应用程序将在端口 8000 上运行。在浏览器中打开 http://127.0.0.1:8000 以查看结果。

可以运行如下命令发布当前开发平台环境下的最终版

cargo build --release

参考文章