当前位置:网站首页>Rust Web(三)—— 通过sqlx连接数据库(MySQL)
Rust Web(三)—— 通过sqlx连接数据库(MySQL)
2022-08-03 01:40:00 【仕上がりへ】
在学习了前辈所演示的 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):
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 inCargo.tomlto use your own version of the dependency. For more information, see: Overriding Dependencies - The Cargo Book
具体需要访问
crates.io来查看合适的版本;而在版本兼容的的情况下,呈现的是以下结果:

连接请求
在根项目的目录下,新建名为
.env的文件,在文件内写入请求 URL;由于笔者所创建的项目是一个子项目,因此其位置位于所在根项目的目录之下;
DATABASE_URL=mysql://{user}:{password}@{IP}:{port}/{database name}二、数据库准备
笔者在此处选择的是过去在名为
test的数据库中的tt1表;内容如下:

三、功能实现
说明
首先简要说明一下本文所涉及 MySQL连接调用的 API
MySqlPoolOptions
new()


参考文档
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<String>, // 使用Option来处理潜在的空值情况
pub uid: Option<i32>,
pub reg_time: Option<i32>,
}
#[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(())
}运行效果

每一个不曾起舞的日子,都是对生命的辜负。
边栏推荐
猜你喜欢

Violence recursion to dynamic programming 08 (pony go chess)

2022-08-02:小红拿到了一个大立方体,该大立方体由1*1*1的小方块拼成,初始每个小方块都是白色。 小红可以每次选择一个小方块染成红色, 每次小红可能选择同一个小方块重复染色, 每次染色以后,

torchvision.datasets.ImageFolder使用详解

qt opengl 使用不同的颜色绘制线框三角形

LVS-NAT模式【案例实验】

The Sandbox 市场平台将上线 Isla Obscura 第五期 NFT 作品集

SAP ABAP Gateway Client 里 OData 测试的 PUT, PATCH, MERGE 请求有什么区别

【SQL】—数据库操作、表操作

高并发基石:多线程、守护线程、线程安全、线程同步、互斥锁,一文扫尽!...

MATLAB绘制填充图(X轴上下两种颜色)
随机推荐
可信的SSL证书颁发机构有哪些
为什么要使用 playwright 做浏览器自动化测试?
8-jwt工具类
UVM中SVA使用指南
在表格数据上,为什么基于树的模型仍然优于深度学习?
PyCharm中常用的快捷键用法详解
WRF-Chem模式调试、运行、结果后处理等遇到的各种问题
常用工具链和虚拟环境-WSL
超级复杂可贴图布局的初级智能文本提示器
”QSqlDatabasePrivate::removeDatabase: connection ‘test-connect‘ is still in use“数据库多次打开报错
怎么从零编写一个 v3 版本的 chrome 浏览器插件实现 CSDN 博客网站的暗黑和明亮主题切换?
YYGH-BUG-06
如何让优炫数据库开机自启
公司封装方式导出excel过程
全栈---JSONP
[Example构造方法增加notNull参数,默认false,允许值为null,值为null的时候不加入到条件中
扩展卡尔曼滤波【转】
不想当Window的Dialog不是一个好Modal,弹窗翻身记...
Go高性能之方法接收器 - 指针vs值
【面经】被虐了之后,我翻烂了equals源码,总结如下