Rust Web 全栈开发(五):使用 sqlx 连接 MySQL 数据库
Rust Web 全栈开发(五):使用 sqlx 连接 MySQL 数据库
本文是一个单独的小项目。
参考文档:https://blog.youkuaiyun.com/weixin_45987327/article/details/126117286
项目创建
新建一个 Rust 项目,打开 Cargo.toml,把 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 时,注意使用版本要相互兼容,否则会出现编译警告。具体需要访问 crates.io 来查看合适的版本。
在终端执行命令 cargo build,构建成功:
数据库准备
新建一个名为 course 的 MySQL 数据库,再新建一个名为 course 的表:
time 如果用 timestamp 类型的话,会报错:error[E0277]: the trait bound `NaiveDate: From<DateTime>` is not satisfied,原因是:the trait `From<DateTime>` is not implemented for `NaiveDate`。
内容如下:
连接请求
在根项目的目录下,新建名为 .env 的文件,在文件内写入请求 URL,形如:
DATABASE_URL=mysql://{user}:{password}@{IP}:{port}/{database name}
这里,我的请求 URL 是:
DATABASE_URL=mysql://root:12138@127.0.0.1:3306/course
功能实现
参考文档:https://docs.rs/sqlx/0.6.0/sqlx/mysql/index.html
use chrono::NaiveDateTime;
use dotenv::dotenv;
use sqlx::mysql::MySqlPoolOptions;
use std::env;
use std::io;
#[derive(Debug)]
pub struct Course {
pub id: i32,
pub teacher_id: i32,
pub name: String,
pub time: Option<NaiveDateTime>,
}
#[actix_rt::main]
async fn main() -> io::Result<()> {
// 检测并读取 .env 文件中的内容,若不存在也会跳过异常
dotenv().ok();
let database_url = env::var("DATABASE_URL")
.expect("DATABASE_URL 没有在 .env 文件里设置");
let db_pool = MySqlPoolOptions::new()
.connect(&database_url)
.await
.unwrap();
let course_rows = sqlx::query!(
r#"SELECT id, teacher_id, name, time FROM course"#
)
.fetch_all(&db_pool)
.await
.unwrap();
let mut courses_list = vec![];
for row in course_rows {
courses_list.push(Course {
id: row.id,
teacher_id: row.teacher_id,
name: row.name,
time: Some(chrono::NaiveDateTime::from(row.time.unwrap())),
})
}
println!("Courses = {:?}", courses_list);
Ok(())
}
运行结果: