Rust Web 全栈开发(五):使用 sqlx 连接 MySQL 数据库

Rust Web 全栈开发(五):使用 sqlx 连接 MySQL 数据库

Rust Web 全栈开发(五):使用 sqlx 连接 MySQL 数据库

本文是一个单独的小项目。

参考文档:https://blog.csdn.net/weixin_45987327/article/details/126117286

项目创建

新建一个 Rust 项目,打开 Cargo.toml,把 edition 改成 "2021"。

在 [dependencies] 部分添加:

bash 复制代码
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,形如:

bash 复制代码
DATABASE_URL=mysql://{user}:{password}@{IP}:{port}/{database name}

这里,我的请求 URL 是:

bash 复制代码
DATABASE_URL=mysql://root:12138@127.0.0.1:3306/course

功能实现

参考文档:https://docs.rs/sqlx/0.6.0/sqlx/mysql/index.html

rust 复制代码
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(())
}

运行结果:

相关推荐
强子感冒了29 分钟前
MYSQL学习笔记:DML & DQL 核心语法
笔记·学习·mysql
Hgfdsaqwr30 分钟前
实战:用Python开发一个简单的区块链
jvm·数据库·python
砚边数影30 分钟前
InfluxDB迁移替换实战:金仓时序数据库如何提高写入性能
数据库·性能优化·时序数据库·kingbase·kingbasees·金仓数据库
eWidget7 小时前
InfluxDB迁移至金仓数据库的同城容灾实践:性能显著提升、运维效率优化,某能源企业实现RPO_5秒的高可靠时序数据管理
运维·数据库·能源·时序数据库·kingbase·kingbasees·金仓数据库
小句7 小时前
MySQL慢查询日志详细使用指南
数据库·mysql·adb
老邓计算机毕设8 小时前
SSM医疗资源普查6qxol(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb开发·医疗资源管理
dyyx1118 小时前
如何从Python初学者进阶为专家?
jvm·数据库·python
码农水水8 小时前
中国邮政Java面试被问:容器镜像的多阶段构建和优化
java·linux·开发语言·数据库·mysql·面试·php
曹牧8 小时前
Oracle:NULL
数据库·oracle
龙之叶9 小时前
【Android Monkey源码解析五】- 异常处理
android·数据库