Rust-Sqlx极简教程

Rust 中使用原生 SQL 与 SQLx 当谈到使用 SQL 时,Rust 生态系统让我们有太多的选择。SQLx 是一个纯粹的异步、与运行时无关的 Rust SQL 包,它允许您在没有 DSL 的情况下使用编译时类型检查的查询。让我们看看 SQLx 的实际应用! 阅读详情

简介

sqlx 是 rust 中的一个数据库访问工具。具有以下特点:

  • 异步:原生就支持异步,在并发性高的场合能够得到更好的支持
  • 编译时检查查询:sqlx可以在 cargo build 的时候检查执行sql和响应值
  • 多数据库支持:PostgresSQL,MySql,SqlLite,MSSql,MariaDB
  • 多运行时支持:支持主流 rust 运行时。async-std,tokio,actix,native-tls,rustls
  • 内置连接池,支持查询缓存

不足

sqlx 不是 orm 框架

实践

本例将使用 sqlx 访问 postgressql 数据库,实现简单的增删改查功能

数据库

数据库采用 postgreSQL,初始建表语句如下:


-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS "public"."course";
CREATE TABLE "public"."course" (
  "id" int8 NOT NULL,
  "teacher_id" int4 NOT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
  "time" date DEFAULT now()
)
;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO "public"."course" VALUES (1, 11, 'cml', '2022-03-25');
INSERT INTO "public"."course" VALUES (2, 22, 'cc', '2022-03-25');
INSERT INTO "public"."course" VALUES (3, 33, 'mm', '2022-03-25');
-- ----------------------------
-- Primary Key structure for table course
-- ----------------------------
ALTER TABLE "public"."course" ADD CONSTRAINT "course_pkey" PRIMARY KEY ("id");


依赖

使用 cargo new 一个新的 project ,并在 toml 中添加如下依赖:

  • sqlx:数据库访问工具
  • dotenv:环境变量工具。本例中将使用此工具处理数据库连接字符串。此工具除了会加载文件中的配置信息,还会加载windows操作系统中的环境变量信息,如 JAVA_HOME 等。
  • chrono:时间和日期工具
  • serde:序列化和反序列化工具
  • actix-web&actix-rt:actix 运行时
[dependencies]
actix-rt="2.6.0"
actix-web="3.3.3"
serde={version="1.0.134",features=["derive"]}
chrono={version="0.4.19",features=["serde"]}
dotenv="0.15.0"
sqlx={version="0.5.10",features=["postgres","runtime-tokio-rustls","macros","chrono"]}

环境变量

一般来说,数据库连接字符串都不会硬编码到程序代码中,需要有一个类似配置文件的文件,将连接信息放文件中, 运行时从文件加载数据库连接信息。

根目录新建一个 .env 的文件,并在里面配置数据库连接字符串:

DATABASE_URL=postgres://cml:123456@192.168.1.239:5432/rust_sqlx

其中, rust_sqlx 为数据库实例的名称

CRUD

说明

在 main 中编写简单的 crud 示例。

  • dotenv().ok():在访问环境变量之前检查一下,防止因读取环境变量失败导致程序恐慌。
  • env::var(“DATABASE_URL”):读取环境变量文件中的数据库连接字符串
  • PgPoolOptions::new().connect():实例化一个数据库连接池
  • sqlx::query!(“sql”) .fetch_all(&pool):执行sql语句

工程目录结构

│  .env
│  Cargo.toml
│  course.sql
│  README.md
│  tree.txt
│  
├─src
│      main.rs

示例代码


use actix_web::{web, App, HttpServer};
use chrono::NaiveDate;
use dotenv::dotenv;
use sqlx::postgres::PgPoolOptions;
use std::env;
#[actix_rt::main]
async fn main() -> Result<(), sqlx::Error> {
    println!("Hello, world!");
    dotenv().ok();
    //读取所有的环境变量
    // for (key, value) in env::vars() {
    //     println!("环境变量内容:{}: {}", key, value);
    // }
    let connection_str = env::var("DATABASE_URL")
        .expect("数据库连接字符串获取失败,请检查env文件是否已配置数据库连接字符串");
    println!("数据库连接字符串是:{}", connection_str);
    let pool = PgPoolOptions::new()
        .max_connections(5)
        // .connect("postgres://cml:123456@192.168.1.239:5432/rust_sqlx")
        .connect(&connection_str)
        .await?;
    println!("db_pool is : {:?}", pool);
    //查询所有
    let list = sqlx::query!("select * from course")
        .fetch_all(&pool)
        .await?;
    let mut vec = vec![];
    for row in list {
        vec.push(Course {
            id: row.id,
            teacher_id: row.teacher_id,
            name: row.name,
            time: row.time,
        })
    }
    println!("数据库中的所有数据:{:#?}", vec);
    //查询单个
    let list2 = sqlx::query!(r#"select * from course where id = $1"#, 1)
        .fetch_all(&pool)
        .await?;
    let mut vec2 = vec![];
    for row in list2 {
        vec2.push(Course {
            id: row.id,
            teacher_id: row.teacher_id,
            name: row.name,
            time: row.time,
        })
    }
    println!("查询单个{:#?}", vec2);
    //增加
    // let insert = sqlx::query!(
    //     r#"INSERT INTO course VALUES ($1, $2, $3)"#,
    //     100000,
    //     11,
    //     "gg"
    // )
    // .fetch_all(&pool)
    // .await?;
    //更新
    let update = sqlx::query!(r#"update  course set name=$1"#, "ogg")
        .fetch_all(&pool)
        .await?;
    Ok(())
}
#[derive(Debug)]
pub struct Course {
    pub id: i64,
    pub teacher_id: i32,
    pub name: String,
    pub time: Option<NaiveDate>,
}


以上代码输出

Hello, world!
数据库连接字符串是:postgres://cml:123456@192.168.1.239:5432/rust_sqlx
db_pool is : Pool { size: 1, num_idle: 1, is_closed: false, options: PoolOptions { max_connections: 5, min_connections: 0, connect_timeout: 30s, max_lifetime: Some(1800s), idle_timeout: Some(600s), test_before_acquire: true } }
数据库中的所有数据:[
    Course {
        id: 1,
        teacher_id: 11,
        name: "ogg",
        time: Some(
            2022-03-25,
        ),
    },
    Course {
        id: 2,
        teacher_id: 22,
        name: "ogg",
        time: Some(
            2022-03-25,
        ),
    },
    Course {
        id: 3,
        teacher_id: 33,
        name: "ogg",
        time: Some(
            2022-03-25,
        ),
    },
    Course {
        id: 100000,
        teacher_id: 11,
        name: "ogg",
        time: Some(
            2022-03-26,
        ),
    },
]
查询单个[
    Course {
        id: 1,
        teacher_id: 11,
        name: "ogg",
        time: Some(
            2022-03-25,
        ),
    },
]

代码

https://gitee.com/naylor_personal/rust-actix/tree/master/workspace/db

引用

  • https://crates.io/crates/sqlx

技术交流

  • 邮箱:cnaylor@163.com
  • QQ群:1158377441
Rust 与 Mysql 交互篇之 Sqlx 数据库在编程中是一个很重要的环节,主要体现在数据的存储上,方方面面都会用到,重要性不言而喻。本教程以`sqlx`及`diesel`两个crate做为基础的教程,介绍其基本用法 阅读详情

相关推荐

Rust SQLx 开发指南:利用 Tokio 进行性能优化

本文介绍了如何结合SQLx异步SQL客户端库和Tokio运行时构建高性能Rust数据库应用。主要内容包括:1)SQLx和Tokio的基本概念与优势;2)从安装配置到连接池管理的完整使用流程;3)利用Tokio实现并发查询、流式处理和批量操作等性能优化技巧;4)事务处理、连接池配置等关键实践;5)缓存、监控等提升性能的最佳实践。文章强调通过合理运用异步特性、批量操作和连接池优化,可以显著提升数据库应用的并发处理能力,同时指出性能优化应基于实际监控数据进行针对性调整。

北京锋通科技有限公司的技术blog 1886

sqlx使用教程

sqlxsql。

一个小白程序员的生活记录 1954

使用 Actix-Web、SQLx 和 Redis 构建高性能 Rust Web 服务

Actix-Web是一个用于构建 Web 应用程序的高性能、异步框架,基于 Rust 语言。异步:使用tokio和async-std等异步运行时,提供高性能和高并发处理能力。中间件:支持中间件机制,可以方便地扩展功能。路由:灵活的路由机制,支持路径参数、查询参数等多种路由方式。类型安全:利用 Rust 的类型系统,确保代码的类型安全性和健壮性。社区支持:拥有活跃的开发者社区和丰富的文档资源。

大白菜代码的博客 2166

Rust中sqlx使用(另加若干报错解决办法)

Rust快速上手sqlx,并解决一些因配置不正确可能遇到的问题。

m0_51336955的博客 3344

Rust中的SQLx数据库交互及实践

本章深入探讨了如何在Rust项目中集成SQLx库,以实现与数据库的高效交互。首先介绍了SQLx作为Rust异步数据库访问工具的优势,例如它支持多种数据库引擎和运行时,并且在社区中广泛使用。然而,它也有缺点,如缺乏内置的SQL抽象验证。接着,本章详细描述了如何在项目中添加SQLx依赖,包括设置Cargo.toml文件,并手动创建必要的数据库表。此外,本章还探讨了如何将数据库连接集成到项目中,提出了几种不同的架构选择,并讨论了如何在大型代码库中抽象化数据库访问,以适应复杂和不断增长的应用需求。

weixin_35811662的博客 906

GD32 I2C中断通信实战:主机与从机高效数据交换方案

本文详细解析了GD32微控制器I2C中断通信的实战方案,通过配置I2C0为主机、I2C1为从机,实现高效的双向数据交换。文章深入剖析了中断服务程序(ISR)的核心配置、关键状态标志位处理以及事件驱动机制,帮助开发者避免常见陷阱,提升系统响应速度与资源利用率,适用于传感器连接、多机通信等嵌入式场景。

cream的博客 846

Rust sqlx包访问sqlite数据库

SQLx是一个易于使用的Rust异步SQL crate。编译时检查查询:SQLx确保您的查询在编译时有效,从而减少运行时错误。异步支持:它可以与异步运行时(如Async -std、tokio和actix)无缝协作。跨平台:SQLx在任何支持Rust的地方编译。连接池:内置连接池,用于高效的数据库访问。您可以将SQLx用于各种数据库,包括PostgreSQL、MySQL、SQLite和MSSQL。SQLite是一个无服务器的嵌入式SQL数据库引擎。它直接读取和写入普通磁盘文件,使其轻量级和高效。

neweastsun的专栏 2514

实测对比:DeepSeek、豆包、千问三大AI模型生成测试用例谁更强?(附完整代码)

本文通过实测对比了DeepSeek、豆包、千问三大AI模型在生成测试用例方面的表现。文章提供了完整的Python代码实现,详细分析了各模型在用例完整性、准确性、边界覆盖及幻觉控制等维度的差异,并分享了工程化集成与多模型融合等优化策略,旨在帮助测试团队选择合适工具以提升工作效率。

ik6789012的博客 939

Rust SQLx CLI 同步迁移数据库

上文我们介绍了SQLx及SQLite,并介绍了如何使用代码同步迁移数据库。本文介绍Sqlx cli 命令行工具,介绍如何安装、使用,利用其提供的命令实现数据表同步迁移。Java生态中有flyway, sqlx cli 功能类似,利用命令行工具可以和其他语言项目工程一起使用。数据库迁移是开发和重构应用程序数据库的过程,是应用程序开发过程的一部分。SQLx CLI是Rust crate SQLx的关联命令行实用程序,用于管理此迁移过程。

neweastsun的专栏 2135

lammps建模(电解液)opls-aa力场的基本流程

lammps建模(电解液)opls-aa力场的基本流程

syj0922的博客 2133

光纤布拉格光栅(FBG)笔记【1】:波导结构和布拉格波长推导

引言 本文是光纤布拉格光栅(FBG)的笔记【1】,主要介绍了光纤布拉格光栅的波导结构,并且利用动量和能量守恒推导了光纤布拉格波长的表达式 普通光纤中让折射率发生周期性变化就是结构最简单的均匀光纤布拉格光栅(FBG),其波导结构如下图所示。 其传感原理描述可以分为以下的三点: ①光纤纤芯传播的光会在每个光栅面进行反射和透射; ②如果不满足布拉格条件,依次排列的光栅平面反射的光会逐渐变得不同直到最后相互抵消;同时由于系数不匹配,与布拉格波长不相符的光在每个光栅平面的反射也很微弱,这些光大部分在光纤中发生透.

subtitle_的博客 2万+

rust使用sqlx示例

这篇文章介绍了如何使用Rust的sqlx库操作MySQL数据库,主要内容包括: 项目结构:展示了完整的Rust代码实现用户添加功能,包含用户实体定义、仓储接口和持久化层实现。 关键技术点: 使用async-trait实现异步特性 通过dotenv读取环境变量配置 使用MySqlPool管理数据库连接池 实现基本的CRUD操作(示例演示了添加用户) 运行效果:展示了程序执行后的数据库插入结果。 项目依赖:介绍了所需的crate包及其作用,包括sqlx、tokio等。 代码结构:详细解释了用户实体、仓储接口和持

技术分享博客 1794

Colmap中 patchmatch源码

惊世骇俗的Colmap PatchMatch源码 500多行,简明易懂 先了解PatchMatch的options: max_image_size: 任一维度的最大图像尺寸 gpu_index: gpu的下标 depth_min,depth_max: 随机采样的深度范围 window_radius:用于计算NCC(两图片的归一化互相关),NCC的计算需要用到 win_size. 图像匹配 | NCC 归一化互相关损失 | 代码 + 讲解 - 知乎 (zhihu.com) window_step: 用.

qq_24884193的博客 2209

Rust 的 SQLx 库: 安全 & 性能

SQLx 凭借“编译时 SQL 验证”和“原生异步支持”,在 Rust 数据库开发中构建了安全与性能的双重优势。

码刀攻城 1534

【GameFramework框架内置模块】6、实体(Entity)

实体Entity就是一个实体的基本单元,类似于Unity的GameObject对象本体,然后这个本体上面附加其他各种各样组件,才能实现各种各样的功能。一般需要在游戏运行时动态加载的游戏对象,比如怪物、武器、子弹、特效,都需要给这个物体挂载一个实体Entity,这样的话就可以方便的对实例出来的对象进行管理。下面就来看一下如何使用吧。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 3137

【树莓派安装Homeassistant及基本配置】

时隔一年,我又重新开始玩Homeassistant,发现其中奥妙无穷,惊喜不断。在我浅薄的认知中要学好嵌入式,必须玩过Homeassistant,并且玩出自己的名堂!因为这是最贴切实际的生活应用没有之一,每月更新使得唯有活水来;拥抱大千使得永葆青春的活力;鬼斧神工的操作精彩纷呈,可以堪称软件与硬件的完美落地!

vor234的博客 1万+

Rust实战:使用Axum和SQLx构建高性能RESTful API

本文介绍了如何使用Rust语言及其Axum框架和SQLx库构建一个高性能的RESTful API服务。主要内容包括:1)项目初始化与环境配置,创建Rust项目并添加必要的依赖项;2)核心业务逻辑实现,定义数据模型、数据库操作及错误处理机制;3)API路由设计,使用Axum框架创建CRUD接口。通过构建一个待办事项管理API的实例,展示了Rust在Web开发中的优势,包括内存安全、类型安全和高效并发处理能力。文章详细说明了从数据库迁移到API实现的完整开发流程,为开发高性能Web服务提供了实用指南。

倔强的石头的博客 6778

7.1华为OD机试真题 新系统 - 奇偶三数之和 (Java/Py/C/C++/Js/Go)

7.1华为OD机试真题 新系统 - 奇偶三数之和 (Java/Py/C/C++/Js/Go)

算法大师! 443

从 API 到应用:用 Rust 和 SQLx 为 Axum 服务添加持久化数据库

这意味着,无论是计划内的更新部署,还是计划外的意外宕机,只要服务重启,所有用户的待办事项都会烟消云散。这对于任何期望提供稳定服务的应用来说,都是完全不可接受的。这确保了无论是在你的 Mac、Windows 还是同事的 Linux 笔记本上,数据库环境都是完全一致的,从而彻底告别了“在我机器上是好的”这类经典难题。这是一个“磨刀不误砍柴工”的过程,坚实的基础设施将为后续的开发带来极大的便利。项目已经从一个基于内存的原型 API,蜕变为一个使用真实数据库进行数据持久化的、更接近生产级别的 Web 应用。

2301_80863610的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Rust + PostgreSQL 极简技术栈应用开发

本文将实操演示如何用 PostgreSQL 替代缓存、消息队列、搜索、分布式锁等常用中间件,基于 Axum + SQLx + PostgreSQL 技术栈,打造极简且可靠的后端架构,适合中小团队、独立开发者快速落地。

github_28443763的博客 587

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

八、Rust 集成 Sqlx

八、Rust 集成 Sqlx      Rust 语言级异步,是 xxx 版添加进来的特性。如果只是需要一款支持异步的连接池工具,推荐 tokio-postgres、deadpool-postgres。而用于生产工序,还是需要 ORM 的加入。本节我们来学习一下 sqlx。 1、集成 Sqlx 1)追加依赖:Cargo.toml serde_yaml = "0.8.13" sqlx = {version = "0.4.0-beta.1", default-features = false, features

xuguangyuansh的博客 3226

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

使用 Diesel 与 SQLx 与 Rust 中的数据库交互

Diesel 是一个支持 PostgreSQL、MySQL、SQLite 的 ORM。ORM 代表对象-关系映射。ORM 帮助面向对象的程序员抽象出关系数据库的细节。ORM 附带查询构建器,因此您不必担心编写原始 SQL 查询。使用 ORM,您可以与关系数据库进行通信,就好像它们是面向对象的一样。对于经验不足的开发人员,使用 ORM 可能会更好,因为 ORM 会优化 SQL 查询。ORM 还使您更不容易受到 SQL 注入攻击。与 Diesel 不同,SQLx 不是 ORM。

分享身边生活经验blog 2081

实战Rust: 使用Axum和SQLx构建Web应用程序

实战Rust: 使用Axum和SQLx构建Web应用程序 realworld-axum-sqlxA Rust implementation of the Realworld demo app spec using Axum and SQLx.项目地址:https://gitcode.com/gh_mirrors/re/realworld-axum-sqlx 一、项目介绍 RealWorld 是一...

gitblog_00982的博客 1188

如何在Axum和Actix-web中集成SQLx:完整Rust Web开发教程

SQLx是一个强大的异步Rust SQL工具包,提供编译时检查的查询功能,无需使用DSL。本文将详细介绍如何在流行的Rust Web框架Axum和Actix-web中集成SQLx,构建高性能的数据库驱动应用。🎯 ## SQLx与Web框架集成概述 SQLx支持PostgreSQL、MySQL、SQLite和MSSQL数据库,与Axum和Actix-web框架完美兼容。通过这种集成,开发者可以

gitblog_00318的博客 1072

SQLx:Rust异步SQL工具包全面解析

SQLx:Rust异步SQL工具包全面解析 【免费下载链接】sqlx ???? The Rust SQL Toolkit. An async, pure Rust SQL crate featuring compile-time checked queries without a DSL. Supports PostgreSQ...

gitblog_00838的博客 1280

Rust 数据库框架SQLx使用

文章目录简介添加依赖async-stdtokio创建表创建连接或连接池连接池单个连接插入记录更新记录查询记录 简介 SQLx是一个rust异步数据库框架,不同于diesel这类支持orm框架,没有DSL,用户自己编写sql语句,将查询结果映射到struct上。 支持 async-std 和 tokio 支持 postgresql 、mysql/maridb、sqlite mysql和postgresql 是纯rust实现的驱动程序(sqlite使用了 libsqlite3 C 库) 支持TLS 嵌套事务

KK下山去买菜 9765
上一篇: Rust极简教程
下一篇: SpringBoot程序数据预装载
Ramble_Naylor
博客等级 码龄12年 206粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ramble_Naylor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值