Rust Web(三)—— 通过sqlx连接数据库(MySQL)

  • 在学习了前辈所演示的 PostgreSQL连接方式后所进行的尝试;

  • 通过这次尝试也能够进一步学习连接MySQL的其中一种方式;

  • 除本文所使用的sqlx连接方法外,还有其他的方式,诸如diesel,以后有机会在进行实践;

目录

Rust Web(三)—— 通过sqlx连接数据库(MySQL)

一、环境准备

项目创建

连接请求

二、数据库准备

三、功能实现

说明

参考文档

代码实现

运行效果


Rust Web(三)—— 通过sqlx连接数据库(MySQL)

一、环境准备


项目创建

  • 在自己选择的目录下,创建一个(子)项目,此处命名为 db

  • 在新建项目的 Cargo.toml 文件内,添加所需要的依赖,具体如下:

[package]
name = "db"
version = "0.1.0"
edition = "2021"
​
[dependencies]
actix-rt="2.7.0"
actix-web="4.1.0"
dotenv = "0.15.0"
chrono = {version = "0.4.19", features = ["serde"]}
serde = {version = "1.0.140", features = ["derive"]}
sqlx = {version = "0.6.0", default_features = false, features = [
    "mysql",
    "runtime-tokio-rustls",
    "macros",
    "chrono",
]}

注意:

  • 在添加 crate 时,注意使用版本要相互兼容,否则会出现编译警告:

The following warnings were discovered during the build. These warnings are an indication that the packages contain code that will become an error in a future release of Rust. These warnings typically cover changes to close soundness problems, unintended or undocumented behavior, or critical problems that cannot be fixed in a backwards-compatible fashion, and are not expected to be in wide use.

Each warning should contain a link for more information on what the warning means and how to resolve it.

To solve this problem, you can try the following approaches:

  • Some affected dependencies have newer versions available. You may want to consider updating them to a newer version to see if the issue has been fixed.

winapi v0.2.8 has the following newer versions available: 0.3.0, 0.3.1, 0.3.2, 0.3.3, 0.3.4, 0.3.5, 0.3.6, 0.3.7, 0.3.8, 0.3.9

  • If the issue is not solved by updating the dependencies, a fix has to be implemented by those dependencies. You can help with that by notifying the maintainers of this problem (e.g. by creating a bug report) or by proposing a fix to the maintainers (e.g. by creating a pull request):

    • [email protected]

    • Repository: GitHub - retep998/winapi-rs: Rust bindings to Windows API

    • Detailed warning command: cargo report future-incompatibilities --id 1 --package [email protected]

  • If waiting for an upstream fix is not an option, you can use the [patch] section in Cargo.toml to use your own version of the dependency. For more information, see: Overriding Dependencies - The Cargo Book

  • 具体需要访问crates.io 来查看合适的版本;

  • 而在版本兼容的的情况下,呈现的是以下结果:

Rust Web(三)—— 通过sqlx连接数据库(MySQL)_第1张图片

 

连接请求

  • 根项目的目录下,新建名为 .env 的文件,在文件内写入请求 URL;

  • 由于笔者所创建的项目是一个子项目,因此其位置位于所在根项目的目录之下;

DATABASE_URL=mysql://{user}:{password}@{IP}:{port}/{database name}

二、数据库准备


  • 笔者在此处选择的是过去在名为 test的数据库中的 tt1表;

  • 内容如下:

Rust Web(三)—— 通过sqlx连接数据库(MySQL)_第2张图片

 

三、功能实现


说明

  • 首先简要说明一下本文所涉及 MySQL连接调用的 API

    • MySqlPoolOptions

      • new()

Rust Web(三)—— 通过sqlx连接数据库(MySQL)_第3张图片

 

参考文档

sqlx::mysql - RustMySQL database driver.https://docs.rs/sqlx/0.6.0/sqlx/mysql/index.html

代码实现

// extern crate chrono;
extern crate dotenv;
extern crate sqlx;
​
// use chrono::NaiveDateTime;
use dotenv::dotenv;
use sqlx::mysql::MySqlPoolOptions;
use std::env;
use std::io;
​
#[derive(Debug)]
pub struct Info {
    pub ind: i32, // 数据库中将此字段设置为了主键
    pub email: Option, // 使用Option来处理潜在的空值情况
    pub uid: Option,
    pub reg_time: Option,
}
​
#[actix_rt::main]
async fn main() -> io::Result<()> {
    dotenv().ok(); // 检测并读取.env文件中的内容,若不存在也会跳过异常
​
    let database_url = env::var("DATABASE_URL")
        .expect("Not configured in .env");
​
    let db_pool = MySqlPoolOptions::new()
        .connect(&database_url)
        .await
        .unwrap();
​
    let tt1_rows = sqlx::query!(
        r#"select ind,email,uid,regtime from tt1 where ind = ?"#,
        6
    )
        .fetch_all(&db_pool)
        .await
        .unwrap();
​
    let mut tt1_list = vec![];
    for row in tt1_rows {
        tt1_list.push(Info {
            ind: row.ind.unwrap(),
            email: row.email,
            uid: row.uid,
            reg_time: row.regtime,
        })
    }
    println!("Info = {:?}", tt1_list);
    Ok(())
}

运行效果

Rust Web(三)—— 通过sqlx连接数据库(MySQL)_第4张图片

 

每一个不曾起舞的日子,都是对生命的辜负。

你可能感兴趣的:(#,Rust,Web,rust,数据库,web,mysql)