Rust-连接数据库
1、选择和安装依赖
这里我们基于数据库mysql5.8版本进行测试和安装
如果想要后期数据库维护和迭代都很好,我们一般采用ORM数据库和Redis相互结合
👉 Rust常见的数据依赖库
🍎sqlx(基础连接)
基础数据库驱动层--简单方便
特点:纯异步、编译时校验 SQL 、支持连接池与事务,无需 DSL 即可直接操作 SQL
适用场景:需要精细控制 SQL 的高性能服务(如实时数据处理、API 网关),也就是原生但是高效开发起来得自己注意代码质量
javascript
// 示例
use sqlx::mysql::MySqlPool;
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
let pool = MySqlPool::connect("mysql://user:pass@localhost/db").await?;
let row: (i32,) = sqlx::query_as("SELECT id FROM users WHERE name=?")
.bind("Alice")
.fetch_one(&pool).await?;
Ok(())
}
🍎 mysql_async-基础连接
特点:基于 Tokio 的异步驱动,专为 MySQL 优化,支持二进制协议与预处理语句。
适用场景:高并发写入场景(如日志采集、交易系统)
🍎 SeaORM**(ORM 层-对象关系映射)**
特点:基于 sqlx 构建,也就是把它封装优化的,支持异步、关系导航、分页、事务嵌套,提供完善的模型宏。
适用场景:快速开发业务系统(如用户管理、订单处理),需减少样板代码,快速迭代开发非常适合
javascript
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "users")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32,
pub name: String,
}
🍎 Diesel**(ORM 层-对象关系映射)**
特点:强类型查询构建器,编译时 SQL 安全校验。
适用场景:遗留系统改造或需要同步阻塞式访问的场景。但是在社区里面却广泛活跃,Diesel ORM库在搭配Axtion-Web库的时候非常好用
Diesel是Rust生态系统中最受欢迎的ORM之一
2、数据库安装使用
👉Diesel库的使用
🍎在Cargo.toml中添加必要的依赖
这里我们额外添加一个dotenv库,用来加载我们的环境变量配置
javascript
[dependencies]
diesel = { version = "2.1.0", features = ["mysql"] }
diesel-async = { version = "0.3.1", features = ["mysql"] }
tokio = { version = "1.0", features = ["full"] }
dotenv = "0.15"
mysql = "24.0.0"
🍎依赖库的作用
javascript
diesel 用于数据库操作
dotenv 用来加载我们的环境变量配置
diesel-async
diesel-async 是 diesel 库的一个扩展,它提供了异步版本的数据库操作。
diesel 是一个用于 Rust 的 ORM(对象关系映射)库,
它允许你使用 Rust 的类型系统来操作数据库。
diesel 本身是同步的,这意味着在进行数据库操作时,线程会被阻塞,直到操作完成。
diesel-async 通过使用 Rust 的异步特性(async/await)和 tokio 运行时
使得数据库操作可以在不阻塞线程的情况下进行
这使得你可以在处理数据库操作的同时,执行其他任务
从而提高应用程序的性能和响应能力
tokio
tokio 是一个用于 Rust 的异步运行时,它提供了异步任务调度、I/O 多路复用、时间驱动
tokio 允许你编写高效的异步应用程序
处理 I/O 操作(如网络请求、文件读写、数据库查询等)时,不阻塞线程。
tokio 提供了一组异步原语和工具,用于构建异步应用程序
这些原语和工具包括异步任务(tokio::task)、异步 I/O(tokio::io)
定时器(tokio::time)等
mysql库
操作数据库
🍎配置环境变量
建立一个文件.env
,存储数据库连接字符串和数据库连接信息,注意对应信息改成自己的数据库信息
javascript
DATABASE_URL=mysql://username:password@localhost:3306/database_name
DATABASE_URL=mysql://用户名:密码@localhost:3306/数据库名
3、数据库连接
👉数据库连接(非ORM方式)
接下来我们采用最简单的方式实现一个最简单的数据库连接,实现的文件以及结构如下
javascript
src/
├── main.rs
├── database.rs
└── modules/
└── user.rs
Cargo.toml
🍎搭建数据库,新建一张表 sys_user
javascript
CREATE TABLE sys_user (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
INSERT INTO sys_user (name, email) VALUES
('张三', '[email protected]'),
('李四', '[email protected]'),
('王五', '[email protected]');
🍎Cargo.toml
javascript
[package]
name = "nexusrust"
version = "0.1.0"
edition = "2024"
[dependencies]
actix-web = "4.5.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
mysql = "24.0.0"
dotenv = "0.15"
🍎database.rs连接数据库
rust
use mysql::*;
use dotenv::dotenv;
use std::env;
// 创建数据库连接
pub fn create_conn() -> mysql::Conn {
dotenv().ok();
let url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
Conn::new(Opts::from_url(&url).expect("Failed to connect to MySQL")
}
🍎user.rs之中写查询用户函数
javascript
use actix_web::{web, HttpResponse};
use mysql::prelude::*;
use serde::Serialize;
#[derive(Serialize)]
pub struct User {
id: u32,
name: String,
email: String,
}
// HTTP 处理函数
pub async fn get_all_users() -> HttpResponse {
let mut conn = crate::database::create_conn();
let users: Vec<User> = match conn.query_map(
"SELECT id, name, email FROM sys_user",
|(id, name, email)| User { id, name, email }
) {
Ok(users) => users,
Err(e) => {
eprintln!("Database query error: {}", e);
return HttpResponse::InternalServerError()
.body("Failed to retrieve users");
}
};
HttpResponse::Ok().json(users)
}
🍎main.rs之中定义接口的路由
javascript
use actix_cors::Cors;
use actix_web::{web, App, HttpServer};
mod modules;
mod database;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
let cors = Cors::default()
.allow_any_origin()
.allow_any_method()
.allow_any_header();
App::new()
.wrap(cors)
.route("/users", web::get().to(modules::user::get_all_users))
})
.bind("127.0.0.1:8080")?
.run()
.await
}
🍎最后我们来测试一下
还是直接打开我们的地址
javascript
http://127.0.0.1:8080/users
//最后返回的数据如下
[{"id":1,"name":"太白1","email":"[email protected]"},
{"id":2,"name":"李太白1","email":"[email protected]"},
{"id":3,"name":"王太白1","email":"[email protected]"}
]
ok,到这里就连接上我们数据库,可以进行接下来的操作了