Rust-连接数据库

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,到这里就连接上我们数据库,可以进行接下来的操作了

相关推荐
烛阴4 分钟前
从0到1掌握盒子模型:精准控制网页布局的秘诀
前端·javascript·css
前端工作日常3 小时前
我理解的`npm pack` 和 `npm install <local-path>`
前端
码小凡3 小时前
优雅!用了这两款插件,我成了整个公司代码写得最规范的码农
java·后端
李剑一3 小时前
说个多年老前端都不知道的标签正确玩法——q标签
前端
嘉小华4 小时前
大白话讲解 Android屏幕适配相关概念(dp、px 和 dpi)
前端
姑苏洛言4 小时前
在开发跑腿小程序集成地图时,遇到的坑,MapContext.includePoints(Object object)接口无效在组件中使用无效?
前端
奇舞精选4 小时前
Prompt 工程实用技巧:掌握高效 AI 交互核心
前端·openai
Danny_FD4 小时前
React中可有可无的优化-对象类型的使用
前端·javascript
用户757582318554 小时前
混合应用开发:企业降本增效之道——面向2025年移动应用开发趋势的实践路径
前端
星星电灯猴4 小时前
Charles抓包工具深度解析:如何高效调试HTTPHTTPS请求与API接口
后端