定制软件开发在学习了前辈所演示的 定制软件开发连接方式后所进行的尝试;
定制软件开发通过这次尝试也能够进定制软件开发一步学习连接MySQL的其中一种方式;
除本文所使用的
sqlx
连接方法外,还有其他的方式,诸如diesel
,以后有机会在进行实践;
目录
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):
winapi@0.2.8
Repository:
Detailed warning command:
cargo report future-incompatibilities --id 1 --package winapi@0.2.8
If waiting for an upstream fix is not an option, you can use the
[patch]
section inCargo.toml
to use your own version of the dependency. For more information, see:
具体需要访问
crates.io
来查看合适的版本;而在版本兼容的的情况下,呈现的是以下结果:
连接请求
在根项目的目录下,新建名为
.env
的文件,在文件内写入请求 URL;由于笔者所创建的项目是一个子项目,因此其位置位于所在根项目的目录之下;
DATABASE_URL=mysql://{user}:{password}@{IP}:{port}/{database name}
二、数据库准备
笔者在此处选择的是过去在名为
test
的数据库中的tt1
表;内容如下:
三、功能实现
说明
首先简要说明一下本文所涉及 MySQL连接调用的 API
MySqlPoolOptions
new()
参考文档
代码实现
- // 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(())
- }
运行效果
每一个不曾起舞的日子,都是对生命的辜负。