SQLx:一款优秀的异步 SQL 工具库

8.Rust+Axum 数据库集成实战:从 ORM 选型到用户管理系统开发 深入探讨 Rust+Axum 数据库集成,包括 ORM 选型及实践,助力用户管理系统开发。id: i32,通过本文的介绍,我们了解了 Rust+Axum 中数据库集成的相关知识,包括 ORM 选型、异步连接池配置、事务管理与连接生命周期,以及用户管理系统的 CRUD 开发实践。合理选择 ORM 工具并正确配置数据库连接池,能为开发高性能、稳定的 Web 应用奠定坚实基础。在实际项目中,开发者可以根据项目需求和自身技术栈来选择合适的方案。 阅读详情

SQLx:一款优秀的异步 SQL 工具库

传统 ORM 工具会引入冗余抽象,而原生 SQL 操作又容易出现运行时错误。SQLx 作为 Rust 生态中备受推崇的 SQL 工具库,以编译时 SQL 验证为核心卖点,兼顾异步支持、轻量等特性,解决了上述痛点。本文将从 SQLx 将逐步讲解其特性、快速上手流程、实战案例及进阶用法,带读者快速掌握这一强大工具。

SQLx 介绍

SQLx 是一个纯 Rust 编写的异步 SQL 工具库,并非传统意义上的 ORM,更偏向是类型安全的 SQL 执行器。它的核心设计理念是:将 SQL 的验证从运行时提前到编译时,通过宏在编译期与数据库建立临时连接,校验SQL语法、字段名、数据类型的合法性,从源头避免大量低级错误。

与其他 Rust 数据库工具(如 Diesel、SeaORM 等)相比,SQLx 具有以下鲜明特点:

  • 无 DSL(领域特定语言):直接使用原生 SQL,无需学习额外的查询语法,降低学习成本,同时保留 SQL 的灵活性。
  • 异步优先:基于 tokio 等异步运行时设计,适配 Rust 异步生态,性能优于同步数据库工具。
  • 多数据库支持:支持 PostgreSQL、MySQL、SQLite 等主流数据库,切换数据库时无需大幅修改代码。
  • 轻量无依赖:核心功能简洁,不引入过多冗余依赖,编译速度快,适合各类 Rust 项目。

简单来说,SQLx 的目标是:让开发者既能享受原生 SQL 的灵活,又能获得 Rust 的类型安全和编译时检查,同时兼顾异步场景的性能需求。

特性讲解

编译时SQL验证

传统 SQL 操作中,SQL 语法错误、字段名拼写错误、字段类型不匹配等问题,只有在程序运行时执行 SQL 才能发现,增加了调试成本和线上风险。而 SQLx 通过 query!、query_as! 等宏,在编译期就会连接数据库,对 SQL 语句进行全方位校验。

实现原理:编译时,SQLx 的宏会读取环境变量中的数据库连接地址(如 DATABASE_URL),建立临时只读连接,将 SQL 语句发送给数据库进行解析和校验,校验通过后才会继续编译;若 SQL 存在错误,比如字段名错误、语法错误,则直接编译失败,给出明确的错误提示。

示例(编译时报错):若数据库中 users 表不存在 agee 字段,以下代码会在编译时直接报错,无需运行程序:

// 编译时会报错:column "agee" does not exist
let user: User = sqlx::query_as!(
    User,
    "SELECT id, name, agee FROM users WHERE id = $1",
    1
)
.fetch_one(&pool)
.await?;

异步支持与连接池

SQLx 基于异步 I/O 设计,完全兼容 tokio、async-std 等 Rust 主流异步运行时,无需额外适配即可在异步项目中使用。同时,SQLx 内置了高效的连接池实现,自动管理数据库连接的创建、复用和释放,避免频繁建立连接带来的性能开销。

连接池带来的好处有:

  • 限制最大连接数,防止数据库因连接过多而崩溃。
  • 复用空闲连接,减少 TCP 握手和认证的开销,提升查询性能。
  • 自动处理连接超时和重连,提升系统稳定性。

SQLx 提供了 PgPool(PostgreSQL)、MySqlPool(MySQL)等连接池类型,配置简单,可根据项目需求调整连接池大小、超时时间等参数。

结构体自动映射

SQLx 支持将查询结果自动映射到 Rust 结构体,无需手动解析查询结果,如逐字段读取、类型转换,大幅简化代码。只需为结构体实现 FromRow 特征(可通过派生宏自动实现),即可通过 query_as! 宏直接将查询结果映射为结构体实例。

use sqlx::FromRow;

// 派生 FromRow 特征
#[derive(Debug, FromRow)]
struct User {
    id: i32,
    name: String,
    email: Option<String>, // 可选字段,对应数据库中的 NULL
    created_at: chrono::NaiveDateTime, // 支持时间类型自动转换
}

// 查询单条记录并映射为 User 结构体
let user: User = sqlx::query_as!(
    User,
    "SELECT id, name, email, created_at FROM users WHERE id = $1",
    1
)
.fetch_one(&pool)
.await?;

println!("{:?}", user);

事务支持

SQLx 提供了完善的事务支持,同时支持嵌套事务(通过保存点机制实现),确保数据一致性。此外,SQLx 还提供了事务闭包模式,自动处理事务的提交和回滚,减少手动操作的冗余代码,降低出错风险。

迁移工具(Migrations)

数据库迁移是项目迭代过程中不可或缺的环节,SQLx 内置了迁移工具 sqlx-cli,支持创建、应用、回滚迁移脚本,统一管理数据库表结构的变更。迁移脚本采用 SQL 文件编写,支持版本控制。

快速上手

下面以 PostgreSQL 为例,讲解 SQLx 的环境搭建、连接数据库、以及基础 CRUD 操作。

环境准备

安装依赖

在 Cargo.toml 中添加 SQLx 依赖,并指定数据库类型和异步运行时 tokio:


安装 sqlx-cli 迁移工具

通过 Cargo 安装 sqlx-cli,用于管理数据库迁移:

cargo install sqlx-cli
配置数据库连接

创建 .env 文件,配置数据库连接地址(这里改为你实际的数据库连接配置):

DATABASE_URL=postgres://username:password@localhost:5432/sqlx_demo

基础 CRUD 操作

创建迁移脚本(创建 users 表)

使用 sqlx-cli 创建迁移脚本,用于创建 users 表:

sqlx migrate add -r create_users

执行后,会在项目根目录生成 migrations 文件夹,并同步创建迁移与回滚这两个脚本文件:

  • XXXXXX_create_users.up.sql
  • XXXXXX_create_users.down.sql

编辑迁移脚本文件:

CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW()
);

编辑回滚脚本文件:

DROP TABLE IF EXISTS users;

执行迁移命令:

sqlx migrate run
编写代码

编辑 src/main.rs,实现用户的新增、查询、更新、删除:

use chrono::NaiveDateTime;
use dotenvy::dotenv;
use sqlx::{PgPool, prelude::FromRow};

// 定义 User 结构体,与 users 表对应
#[derive(Debug, FromRow)]
struct User {
    id: i32,
    name: String,
    email: Option<String>,
    created_at: NaiveDateTime,
}

// 初始化数据库连接池
async fn init_pool() -> PgPool {
    dotenv().ok();

    let database_url =
        std::env::var("DATABASE_URL").expect("DATABASE_URL environment variable not set");

    PgPool::connect(&database_url)
        .await
        .expect("Failed to connect to database")
}

// 新增用户
async fn create_user(pool: &PgPool, name: &str, email: Option<&str>) -> Result<User, sqlx::Error> {
    let user = sqlx::query_as!(
        User,
        "INSERT INTO users (name, email) VALUES ($1, $2) RETURNING *",
        name,
        email
    )
    .fetch_one(pool)
    .await?;

    Ok(user)
}

// 根据ID查询用户
async fn get_user_by_id(pool: &PgPool, id: i32) -> Result<Option<User>, sqlx::Error> {
    let user = sqlx::query_as!(User, "SELECT * FROM users WHERE id = $1", id)
        .fetch_optional(pool)
        .await?;

    Ok(user)
}

// 更新用户名称
async fn update_user_name(pool: &PgPool, id: i32, new_name: &str) -> Result<u64, sqlx::Error> {
    let result = sqlx::query!("UPDATE users SET name = $1 WHERE id = $2", new_name, id)
        .execute(pool)
        .await?;

    Ok(result.rows_affected()) // 返回受影响的行数
}

// 删除用户
async fn delete_user(pool: &PgPool, id: i32) -> Result<u64, sqlx::Error> {
    let result = sqlx::query!("DELETE FROM users WHERE id = $1", id)
        .execute(pool)
        .await?;

    Ok(result.rows_affected())
}

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    // 初始化连接池
    let pool = init_pool().await;
    println!("Connected to database successfully!");

    // 新增用户
    let new_user = create_user(&pool, "Alice", Some("alice@example.com")).await?;
    println!("Created user: {:?}", new_user);

    // 根据ID查询用户
    let user = get_user_by_id(&pool, new_user.id).await?;
    println!("Found user: {:?}", user);

    // 更新用户名称
    let affected_rows = update_user_name(&pool, new_user.id, "Alice Smith").await?;
    println!("Updated {} rows", affected_rows);

    // 删除用户
    let affected_rows = delete_user(&pool, new_user.id).await?;
    println!("Deleted {} rows", affected_rows);

    Ok(())
}

SQLx 进阶

连接池优化配置

默认的连接池配置可能无法满足高并发场景的需求,可通过 PgPoolOptions(PostgreSQL)自定义连接池参数,优化性能:

use dotenvy::dotenv;
use sqlx::postgres::PgPoolOptions;

async fn init_optimized_pool() -> PgPool {
    let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL not set");

    PgPoolOptions::new()
        .max_connections(20) // 最大连接数,根据数据库性能调整
        .min_connections(5) // 最小空闲连接数,减少连接建立开销
        .acquire_timeout(std::time::Duration::from_secs(3)) // 连接获取超时时间
        .idle_timeout(std::time::Duration::from_secs(60)) // 空闲连接超时时间
        .connect(&database_url)
        .await
        .expect("Failed to create optimized pool")
}

批量操作优化

在需要批量插入、更新数据时,应当避免循环调用单条操作,这会导致频繁与数据库交互,严重影响性能,可以使用 SQLx 的批量操作功能,减少数据库交互次数。

// 新建用户专用结构体
#[derive(Debug)]
pub struct NewUser {
    pub name: String,
    pub email: Option<String>,
}

async fn batch_insert_users(
    pool: &PgPool,
    new_users: Vec<NewUser>,
) -> Result<Vec<User>, sqlx::Error> {
    if new_users.is_empty() {
        return Ok(Vec::new());
    }

    // 开启事务
    let mut tx = pool.begin().await?;

    // 动态生成批量插入的占位符:($1,$2), ($3,$4), ...
    let placeholders: Vec<String> = new_users
        .iter()
        .enumerate()
        .map(|(i, _)| format!("(${}, {})", i * 2 + 1, i * 2 + 2))
        .collect();

    // 构建完整 SQL
    let sql = format!(
        "INSERT INTO users (name, email) VALUES {} RETURNING id, name, email, created_at",
        placeholders.join(", ")
    );

    // 绑定所有参数
    let mut query = sqlx::query_as::<_, User>(&sql);
    for user in new_users {
        query = query.bind(user.name).bind(user.email);
    }

    // 执行
    let users: Vec<User> = query.fetch_all(&mut *tx).await?;

    // 提交事务
    tx.commit().await?;

    Ok(users)
}

事务进阶:嵌套事务与保存点

SQLx 支持嵌套事务,通过保存点(Savepoint)机制实现,当嵌套事务失败时,仅回滚当前嵌套层级的操作,不影响外层事务。

async fn nested_transaction_example(pool: &PgPool) -> Result<(), sqlx::Error> {
    let mut tx = pool.begin().await?;

    // 外层事务操作:插入用户
    let user = sqlx::query_as!(
        User,
        "INSERT INTO users (name, email) VALUES ($1, $2) RETURNING *",
        "Bob",
        Some("bob@example.com")
    )
    .fetch_one(&mut *tx)
    .await?;

    // 创建保存点(等价于嵌套事务)
    sqlx::query("SAVEPOINT nested_tx").execute(&mut *tx).await?;

    // 嵌套事务内操作:更新用户名
    sqlx::query!(
        "UPDATE users SET name = $1 WHERE id = $2",
        "Bob Brown",
        user.id // 修复:弃用 last_insert_id(),直接用结构体id
    )
    .execute(&mut *tx)
    .await?;

    // 回滚到保存点(仅撤销嵌套内的操作,不影响外层)
    sqlx::query("ROLLBACK TO SAVEPOINT nested_tx")
        .execute(&mut *tx)
        .await?;

    // 释放保存点(可选)
    sqlx::query("RELEASE SAVEPOINT nested_tx")
        .execute(&mut *tx)
        .await?;

    // 提交外层事务,插入操作生效
    tx.commit().await?;

    Ok(())
}

编译时验证的离线模式

默认情况下,SQLx 的编译时验证需要连接真实数据库,但在 CI/CD 环境或生产环境编译时,可能无法访问数据库。此时可使用 SQLx 的离线模式,提前生成验证元数据,避免编译时依赖数据库。

生成离线元数据:

cargo sqlx prepare

执行后,会生成 .sqlx 目录,目录下包含着所有 SQL 验证的元数据。编译时,SQLx 会读取该文件进行验证,无需连接数据库。

总结

随着 Rust 异步生态的不断完善,SQLx 也在持续迭代,未来将支持更多数据库特性、优化性能、简化使用流程。不过需要注意的是,SQLx 的版本还处于 0.x 阶段,并没有完全稳定下来,有时候会存在一些破坏性更新,这点在使用时仍需要注意。

Rust构建安全Web后端:从类型系统到实战防御SQL注入、XSS与CSRF 在Web开发领域,应用安全是构建可靠系统的基石。其核心原理在于对用户输入与数据流进行严格的可信度管理与边界控制,以防止恶意代码注入或未授权操作。从技术实现层面看,类型安全与内存安全是保障应用健壮性的关键机制,它们能在编译期而非运行时拦截大量潜在漏洞,显著提升软件的内在安全性。这种设计带来的技术价值是根本性的:它改变了开发者编写代码的思维方式,从被动防御转向主动构建,将安全内化为架构的一部分。在Web应用场景中,这一理念尤其适用于防御SQL注入、XSS(跨站脚本攻击)和CSRF(跨站请求伪造)等经典威胁。通过 阅读详情

相关推荐

Rust语言的数据库交互

Rust是一种系统编程语言,具有安全、并发和快速的特点。它的设计初衷是为了消除内存管理中的常见错误,例如空指针引用和数据竞争。Rust使用所有权和借用机制,使得开发者能够更安全地管理内存,同时又不牺牲性能。在数据库交互方面,Rust提供了多种库和框架,使得开发者能够高效地与数据库进行通信。接下来,我们将探讨如何在Rust中操作数据库。

2501_90416935的博客 454

[特殊字符] 探索 Rust 开源世界的瑰宝: realworld-axum-sqlx

在开源社区中,一款结合了现代编程语言Rust的优雅以及强大数据库支持的应用项目正逐渐崭露头角 —— **realworld-axum-sqlx**。作为一次技术与创造力的碰撞,该项目不仅提供了对实时世界应用的最佳实践指导,还展示了Axum Web框架与SQLx数据库客户端的完美融合。 ## 🔍 项目介绍 realworld-axum-sqlx是一个雄心勃勃的项目,它立足于Realworld规

gitblog_00601的博客 1038

Rust语言的数据库编程

Rust于2010年首次发布,旨在提供一种系统编程语言,该语言具有与C和C++相媲美的性能,同时能够避免内存管理中的许多常见错误,如空指针引用和数据竞争。Rust通过其独特的所有权系统和借用检查器,确保了内存安全和线程安全。

2501_90407328的博客 477

终极Rust Web开发指南:使用realworld-axum-sqlx构建高性能后端

realworld-axum-sqlx是一个基于Rust语言的Realworld示例应用实现,它展示了如何使用Axum Web框架和SQLx数据库客户端,以PostgreSQL作为数据库后端构建现代化Web应用。本教程将带你从零开始了解这个项目的核心架构、最佳实践和快速上手步骤,帮助你掌握Rust Web开发的精髓。 ## 🚀 为什么选择realworld-axum-sqlx? 作为Rust

gitblog_01063的博客 1075

rust编写web服务04-数据库初体验

编译时检查: SQL查询在编译时验证异步支持: 基于Tokio的异步操作类型安全: 强类型映射到Rust结构体多数据库支持连接池: 内置连接池管理迁移支持: 内置数据库迁移工具Active,Inactive,Pending,// 创建用户请求// 更新用户请求// 用户查询参数编译时SQL检查: 查询在编译时验证类型安全映射: 自动映射到Rust结构体异步操作: 基于Tokio的异步支持连接池: 高效的连接管理。

lpfasd123的博客 2625

通达信股本变迁文件(gbbq)解密方法

近年来A股市场跌宕起伏真特么精彩,本人愚钝,被整爆仓,损失惨重 痛定思痛,认为交易这种对纪律要求极高,且必须完全排除情绪影响的勾当,还是应该交给程序来干 数据哪里来呢?当然是拿来主义。。。问券商的交易软件要呗 到处查资料,得知通达信的权息文件数据齐全,不仅含有除权除息数据,还含有限售解禁、增发、可转债上市等股本变化数据 ——这对于某些对成交量变化敏感的交易模型是非常重要的

不甘碌碌老,结庐铸宝刀 2万+

RealWorld Rust Axum Sqlx 项目教程

RealWorld Rust Axum Sqlx 项目教程 1. 项目介绍 RealWorld Rust Axum Sqlx 项目是一个全栈实现,使用 Rust、Axum、Sqlx 和 Yew 构建。该项目旨在提供一个完整的 RealWorld 应用实现,涵盖了从后端 API 到前端 Web 应用的所有部分。通过这个项目,开发者可以学习如何使用 Rust 构建高性能的 Web 应用,并了解如何将不...

gitblog_00067的博客 424

2026年9月20日 2026年CSP-S初赛真题整理

这是本次考试最难的部分,涉及Gray Code(格雷码)+ 状态压缩 + 数学推导难点解决方案关键代码问题转化将得分差转化为m−2xim - 2x[i]m−2xi高效枚举Gray Code相邻状态O(1)转移奇偶判断利用奇偶性统一条件。

weixin_51184047的博客 622

Rust数据库操作ORM框架比较

Diesel作为最早出现的ORM之一,拥有最完善的文档和社区支持,但仅支持关系型数据库。从生态成熟度来看,Diesel适合需要稳定性的传统项目,而SeaORM更适合追求现代化异步编程的开发者。对于重视编译时安全的项目,Diesel和SQLx是更好的选择,而SeaORM的灵活性更高。异步编程是现代Rust项目的标配,各框架的异步支持程度各异。Diesel的宏系统需要较长的适应期,但其完善的文档降低了学习门槛。对性能极其敏感的场景,SQLx配合手动优化SQL是最佳方案,而一般业务场景下三者的性能差异不大。

ujogok_360的博客 315

2022年电赛E题声源定位跟踪系统

电赛声源定位

qq_53357019的博客 2万+

STM32CubeMX Nucleo F767ZI 教程(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 官网上买了个NUCLEO F767ZI 的开发板,144引脚的芯片,https://www.st.com/content/st_com/zh/products/evaluation-tools/prod

fafuwxm 2028

Rust的常用框架和工具库

Rust近些年来逐渐兴起,虽然它们还没有像 JavaScript 或 Python 那样流行,但在性能和开发效率上表现非常优秀。让我为您详细讲解一下目前 Rust 中比较热门的几个常用框架,看看它们的推荐指数、用户基数、流行趋势和性能,帮您做出合适的选择。

YunWisdom 1353

国产NAS哪家强?极空间&绿联&威联通&群晖对比

随着个人数据量暴增,传统网盘空间不足和下载速度慢问题愈发凸显。新势力NAS,作为数据管理领域的璀璨新星,正以其独特的互联网设计理念,引领家庭及小型办公用户向数据存储的新纪元。它不仅仅是一款产品,更是为初学者用户量身定制的贴心伙伴。其系统界面之简洁、操作流程之直观,让人一目了然,真正实现了“即插即用”的极致便捷。同时,新势力NAS在保持专业水准的同时,更提供了多样化的扩展性配置,轻松应对各种数据存储与管理需求,让家庭及小型办公场景下的数据管理变得前所未有的简单与高效。

专注大数据、云计算、人工智能、机器人领域技术传播 3643

Rust Web开发实战——从Actix-web框架到RESTful API完整构建

本文介绍了使用Rust的Actix-web框架构建Web应用的完整流程。主要内容包括: 框架选型:对比了Actix-web、Rocket和Axum三大Rust Web框架的性能、易用性和适用场景 Actix-web基础: 项目初始化与依赖配置 路由定义(GET/POST/PUT/DELETE) 请求参数解析(Query/Path/Json/Form) 响应构建(Json/Plain/File) 中间件开发: 内置中间件(日志、CORS)的配置 自定义中间件的实现方法 实战重点: 类型安全的SQL查询 JWT

编程世界如山海,探索不止。 9642

s9keaz128 UART Bootloader 单片机篇(上)

网络上充斥着各种各样的串口升级方案,基本都是基于Y-Mode协议下载。采用这种升级方案学习还是可以,用在产品上还是有点欠缺。如下载完成后,需要把时间发送到设备就不好搞了。如下这个设备返回的信息,最后一项就是固件更新时间。固件名称: KEA128编译时间固件版本: 1.0.3硬件版本: 1.0.3产品序列号功能名称: App固件更新时间串口升级演示视频。

一人科技 1795

视觉Transformer实战 | Token-to-Token Vision Transformer(T2T-ViT)详解与实现

Vision Transformer (ViT) 在计算机视觉领域取得了巨大成功,但标准的 ViT 存在一些局限性,如需要大规模预训练数据、对局部结构建模不足等。Token-to-Token ViT (T2T-ViT) 通过引入渐进式分词过程改进了原始 ViT,使其能够在中小型数据集上取得更好的性能。本节将详细介绍 T2T-ViT 的技术原理,并使用 PyTorch 从零开始实现 T2T-ViT。

盼小辉丶的博客 4万+

Rust SQLite WebUI - 极致轻量级的SQLite管理工具

这篇文章介绍了一个轻量高效的SQLite数据库Web管理工具——Rust SQLite WebUI。该工具采用Rust+Axum后端和Solid.js前端技术栈,具有极致轻量(Docker镜像仅10MB)、高性能(内存占用约1MB)的特点。主要功能包括多数据库支持、SQL编辑器、AI智能助手(支持自然语言转SQL和SQL纠错)等。文章详细讲解了技术实现细节,包括Docker镜像优化、内存管理、安全机制等,并提供了快速部署指南。项目已开源,适合需要轻量级SQLite管理方案的用户。

weixin_51426778的博客 400

基于UC3842的反激电源的全面深入解析与MATLAB仿真

内置电流检测,可实现电流模式控制,提高系统的动态响应性。多种保护功能,如欠压锁定、过温保护、短路保护等,确保系统的安全可靠运行。宽工作电压范围,适应不同的电源设计需求。简单的外部元件配置,易于实现。UC3842的典型应用包括开关电源、DC-DC转换器和反激式电源等,其稳定性和可靠性在实际应用中得到了广泛验证。

qq_38334677的博客 1086

Rust生态精选资源指南:从Awesome清单到高效开发实践

在现代软件开发中,依赖管理和技术选型是提升工程效率的核心环节。其原理在于通过社区筛选和分类,将优质工具库系统化组织,形成可复用的知识图谱。这种模式的技术价值在于显著降低开发者的决策成本,避免重复造轮子,并加速项目启动。在Rust生态中,这种实践尤为关键,因为其高速增长的库生态需要有效的导航机制。本文聚焦于如何利用精选的Awesome清单作为Rust开发的“藏宝图”,深入解析Web框架选型、异步运行时抉择等关键决策,并结合serde序列化、tokio异步编程等核心工具,帮助开发者构建高效可靠的技术栈。

weixin_30414305的博客 197

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Rust学习规划

3. 生产级微服务:参考 "zero-to-production" 项目,构建订单管理服务,含 tracing、OpenTelemetry、Docker 部署、CI/CD。- 框架选型:推荐 Axum(Tokio 官方出品,API 现代、类型安全、与异步生态集成好),Actix-web 作为备选。- 环境搭建:rustup、Cargo、rustfmt、clippy、rust-analyzer。- 测试策略:单元测试、集成测试(httpc-test/reqwest)、Mock。

leijmdas的专栏 201

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Rust语言的Web开发

Rust是一种系统编程语言,旨在提供内存安全和并发支持。它的设计理念是将内存管理的责任从开发者手中解放出来,减少潜在的错误(如空指针和缓冲区溢出)。Rust通过其所有权(Ownership)、借用(Borrowing)和生命周期(Lifetimes)等特性,确保了内存安全。

2501_90485535的博客 511

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 使用 Axum 构建高性能异步 Web 服务
下一篇: Rust 操作 Redis 从入门到生产级应用
Rust研习社
博客等级 码龄11年 51粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值