使用 SQLite 和 Rocket 在 Rust 中创建 API

无论您是因为 SQLite 是世界上最流行的数据库引擎而使用它,还是因为它是最受欢迎的语言而使用 Rust ,这两种技术都不会出错。SQLite 和 Rust 将为您提供速度和效率。

本教程将演示如何使用 SQLite 作为 Rust API 的数据库上下文系统。我们将创建一个 SQLite 数据库,设置并安装用于编写服务器逻辑的 Rocket 框架,然后使用 Diesel 框架处理与 SQLite 数据库的连接。

让我们开始吧!

跳跃前进:

  • 先决条件

  • 什么是 SQLite?

  • 使用 Cargo 初始化项目

  • 设置 SQLite

  • 使用 Rust 连接到 SQLite 数据库

  • 熟悉 Rocket 框架

  • 熟悉 Diesel 框架

  • 构建待办事项 API使用 Diesel 创建迁移用 Rust 编写 API 逻辑路由生锈的火箭

先决条件

要学习本教程,您需要具备以下条件:

  • 熟悉 Rust 编程语言和 Cargo 构建系统和包管理器

  • 数据库连接的基本理解

  • 能够在您喜欢的环境中启动开发项目

什么是 SQLite?

SQLite是一种关系数据库管理系统,我可以将 Google 地图设置为 IPhone 上的默认地图吗?在设置复杂性和资源使用方面具有轻量级的感觉。它是无服务器的,需要零配置。如何使用 CSV 文件将密码导入 Google Chrome因为 SQLite 实际上是驻留在单个跨平台文件中的数据库,所以它不需要管理。

SQLite 事务符合 ACID(原子的、一致的、隔离的和持久的),提供对多线程操作的安全访问。听起来轻巧且经过“精简”,但它具有 SQL2 标准中的大部分重要查询语言功能。

使用 Cargo 初始化项目

Cargo 使启动任何类型的 Rust 项目变得更加容易。如何在 PayPal 上收款对于我们的 SQLite API 项目,我们将使用以下命令进行初始化:

cargo new rust-rocket-sqlite-api --bin

这将创建文件。Cargo.toml

为 SQLite 设置

SQLite 是本教程中的默认数据库存储,因此下一步,如何清除您的 Spotify 队列为您的机器安装 SQLite 驱动程序。

SQLite 已预装在新的 Mac 计算机上,但(如果需要)Mac 命令如下:

brew install sqlite 

以下是 Linux 用户的安装命令:

sudo apt install sqlite3

现在,确认安装,如下所示:

sqlite3 --version

接下来,运行一个实例:

sqlite3

您应该看到以下输出:

如果您不熟悉如何使用 SQLite3 数据库,如果您的 USB 端口停止工作该怎么办可以在此处了解更多信息。

使用 Rust 连接到 SQLite 数据库

现在,让我们连接到 SQLite 数据库。

首先,使用以下命令在终端中运行 SQLite 实例:

sqlite3

接下来,我们需要一个数据文件。使用以下命令创建一个名为的文件夹data并导航到其中:

sqlite filename.db

我们将创建一个名为. 接下来,想要更好的 GPU 性能?立即更新您的 Nvidia 和 AMD 驱动程序我们将创建一个包含用户名和密码的表:data.db

create table users(username text PRIMARY KEY, password text);

如果我们运行命令,如何通过手机将游戏安装到 PS5 和 Xbox我们将看到它现在是数据库引擎中的一个表:.tablesusers

接下来,让我们用值填充用户表:

 insert into users(username, password) values ("Jon Doe", "j0hnd03");
sqlite> select * from users;

在文件中,在 dependencies 部分添加crate:Cargo.tomlSQLite

[dependencies]
sqlite = "0.30.1"

现在,构建项目以确保没有错误:

cargo build

此命令将下载并构建依赖包并编译项目。

熟悉 Rocket 框架

Rocket是一个流行的 Rust 后端 Web 开发框架,如何在 Windows 11 中启用 Internet Explorer 模式如 Actix Web 框架。它比 Actix Web 更新并提供了一些优势。首先,在 Rocket 中编写应用程序更容易,因为大部分样板代码都包含在引擎盖下。

另一个优势是 Rocket 的中间件组件和处理程序更容易实现,如何在 Mac 上运行 iPhone 和 iPad 应用程序因为它们不需要对流程有任何深入的了解。

要安装 Rocket,只需在文件的依赖项下指定框架及其版本。由于我们使用 Rocket 作为 Web 框架,存储空间不足?如何释放 Apple Watch 上的空间我们不需要在依赖文件中指定 SQLite 及其版本:Cargo.toml

[dependencies]
rocket = "0.5.0-rc.2"

熟悉 Diesel 框架

Diesel是一个ORM 框架,可用于创建和处理与 SQLite 数据库的连接。Diesel 依赖于libpq、libmysqlclient和libsqlite3。要安装 Diesel,如何在 iPhone 或 Android 手机上运行诊断程序我们只需要在依赖文件中指定即可。我们可以将 Diesel 添加到我们的 Rusty Rocket 中,如下所示:

[dependencies]
rocket = "0.5.0-rc.2"
diesel = { version = "2.0.2", features = ["sqlite"] }
dotenvy = "0.15"

在这里,我们还添加了dotenvy库来管理环境变量。如何在 iPhone 或 iPad 上编辑照片和视频该库查找以 结尾的文件以查找要加载的所有环境变量。我们将创建一个名为now 的文件,并输入以下变量:.env.env

DATABASE_URL=data.db

我们将diesel cli在本地使用来管理项目。如何在 Xbox Series X/S 上使用快速恢复在游戏之间切换要安装它,只需运行以下命令:

cargo install diesel_cli

虽然这是通用命令,如何传输 PS4 游戏并将数据保存到 PlayStation 5但我们可以删除diesel_cli任何不需要的库并指定我们想要的库。在这种情况下,我们需要 SQLite,因此我们将运行以下命令:

cargo install diesel_cli --no-default-features --features sqlite 

此命令可防止安装默认值,SQLite 除外。接下来,我们将使用 Diesel 来设置迁移:

diesel setup

构建待办事项 API

为了演示我们已安装的包的用法,我们将构建一个待办事项 API。

让我们从创建一个新项目开始:

cargo new rusty-rocket --bin

使用 Diesel 创建迁移

接下来,我们将使用 Diesel 创建一个目录来处理迁移。如何使用迁移助手将数据传输到新 Mac在您运行此命令后,Diesel 会自动执行此操作:

diesel migration generate create_tasks

生成的目录名为create_tasks,其中包含两个文件:

  • up.sql: 应用迁移的语句

  • down.sql: 恢复迁移的语句

您可以在这些文件中编写迁移。如何在 Windows 10 中启用深色模式例如,我们的CREATE声明将在文件中:up.sql

-- Your SQL goes here
CREATE TABLE IF NOT EXISTS tasks
(
    id INTEGER PRIMARY KEY NOT NULL,
    name TEXT NOT NULL,
    description TEXT NOT NULL
);

相应的语句将在文件中:down.sql

DROP TABLE tasks;

将这些语句添加到相应文件后,使用以下命令应用迁移:

diesel migration run

要确认这是否有效,请检查父目录中是否有一个名为. 如果您使用一个,如何设置和自定义 Apple 的 MacOS则可以将其与和文件一起添加到您的文件中。db.sqlite3.gitignoretarget/.env

另外,尝试运行以确认文件正确撤消文件。diesel migration redodown.sqlup.sql

用 Rust 编写 API 逻辑

到目前为止,我们已经使用 Diesel 创建了数据库。如何关闭 Netflix 字幕现在,我们需要写一个连接数据库的模块,还要写待办API逻辑。

但首先,让我们对文件进行以下更改:Cargo.toml

[package]
name = "rusty-rocket"
version = "0.1.0"
edition = "2021"

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

[dependencies]
rocket = { version = "0.5.0-rc.2", features = ["json"] }
sqlx = { version = "0.6", features = ["runtime-tokio-native-tls", "sqlite"] }
tokio = { version = "1", features = ["full"] }

我们以前的所有依赖项以及更多内容都包含在这些父包中。

接下来,我们将通过创建一个包含模块名称的文件夹以及同名的 Rust 源文件来添加模块。如何使表格边框在 Google 文档中不可见我们将创建一个文件和一个名为. 在此目录中,Valorant vs CSGO:哪个更好?我们将添加两个文件,一个用于请求,一个用于响应:database.rsdatabase

  1. requests.rs文件requests:

use rocket::serde::Deserialize;

#[derive(Deserialize, Debug)]
#[serde(crate = "rocket::serde")]
pub struct TaskRequest {
    pub name: String,
    pub description: String,
}

2) responses.rs文件responses:

use rocket::serde::Serialize;
use sqlx::FromRow;

#[derive(Serialize, FromRow, Debug)]
#[serde(crate = "rocket::serde")]
pub struct Task {
    pub id: i64,
    pub name: String,
    pub description: String,
}

现在。我们将通过在文件中调用它来公开模块。主板没有通电[修复]我们还将建立与数据库的连接,以及编写用于创建和轮询任务的和函数。database.rscreateget

逻辑如下所示:

use sqlx::{Pool, Sqlite};

pub mod requests;
pub mod responses;

use responses::Task;

pub type DBResult<T, E = rocket::response::Debug<sqlx::Error>> = std::result::Result<T, E>;

pub async fn create_task(
    pool: &Pool<Sqlite>,
    name: &String,
    description: &String,
) -> DBResult<i64> {
    let mut connection = pool
        .acquire()
        .await?;
    let id = sqlx::query_as!(
            Task,
            r#"
        INSERT INTO tasks (name, description) VALUES (?, ?);
        "#,
            name,
            description
    )
        .execute(&mut connection)
        .await?
        .last_insert_rowid();
        Ok(id)
}

pub async fn get_task(pool: &Pool<Sqlite> id: i64) -> DBResult<Task> {
    let mut connection = pool.acquire()
        .await?;
    let task = sqlx::query_as!(
        Task,
        r#"
        SELECT id, name, description from tasks
        WHERE id = ?;
        "#,
            id
    )
        .fetch_one(&mut connection)
        .await?;
        Ok(task)
}

pub async fn get_tasks(pool: &Pool<Sqlite>) -> DBResult<Vec<Task>> {
    let mut connection = pool.acquire()
        .await
        .unwrap();
    let tasks = sqlx::query_as::<_, Task>(
        r#"
        select id, name, description from tasks;
        "#
    )
        .fetch_all(&mut connection)
        .await?;
        Ok(tasks)
}

路由生锈的火箭

是时候借助Rocket框架在文件中编写路由逻辑了:main.rs

#[macro_use]
extern crate rocket;
mod database;

use database::requests::TaskRequest;
use database::responses::Task;
use database::{create_task, get_task, get_tasks, DBResult};
use rocket::serde::json::Json;
use rocket::State;
use sqlx::{Pool, Sqlite, SqlitePool};

#[post("/tasks", format = "json", data = "<task>")]
async fn create(task: Json<TaskRequest>, pool: &State<Pool<Sqlite>>) -> DBResult<Json<Task>> {
    let id = create_task(pool, &task.name, &task.description).await?;
    let task = get_task(pool, id).await?;
    Ok(Json(task))
}

#[get("/tasks")]
async fn index(pool: &State<Pool<Sqlite>>) -> DBResult<Json<Vec<Task>>> {
    let tasks = get_tasks(pool).await?;
    Ok(Json(tasks))
}

#[get("/tasks/<id>")]
async fn detail(id: i64, pool: &State<Pool<Sqlite>>) -> DBResult<Json<Task>> {
    let task = get_task(pool, id).await?;
    Ok(Json(task))
}

#[rocket::main]
async fn main() -> Result<(), rocket::Error> {
    let pool = SqlitePool::connect("sqlite://db.sqlite3")
        .await
        .expect("Couldn't connect to sqlite database");

    sqlx::migrate!()
        .run(&pool)
        .await
        .expect("Couldn't migrate the database tables");

    let _rocket = rocket::build()
        .mount("/", routes![index, create, detail])
        .manage(pool)
        .launch()
        .await?;
    Ok(())
}

现在,我们可以继续运行该项目,在父目录中使用以下命令:

cargo run

以下是构建后 Rocket 在控制台中运行的输出:

结论

在本教程中,我们演示了如何使用 Rocket 和 Diesel 构建一个简单的待办事项 API。如何在 Windows 11/10 中检查蓝牙编解码器我们看到了 Rust 如何使用 Rocket 处理与 SQLite 数据库的连接。

这个示例项目可以按照您喜欢的任何方式构建。例如,使用此处描述的概念,您可以为架构和模型创建模块,而不是将它们写入文件。database.rs

猜你喜欢

转载自blog.csdn.net/weixin_47967031/article/details/129953399