Rust个人学习之Rust操作Mysql数据库

Rust 使用 mysql 的 crate 进行 mysql 的连接操作,特进行记录。

写在前面

如果想使用 mysql 需要在 CargoToml 文件中增加 mysql 的引用

[dependencies]
chrono = "0.4"
mysql = "*"

连接数据库

数据库信息如下:

字段数据
数据库地址Dbpath
数据库端口3306
数据库用户Dbuser
数据库密码Pwd
数据库名称Dbname

如果采用命令行登录,会按照如下方式进行访问:

mysql -h Dbpath -u Dbuser -p Pwd

在 Rust 中想建立一个数据库连接有以下几个步骤:
1、 初始化一个数据库的参数对象Opts
常见的处理方式有两种:
方式一:通过 url 的方式进行建立

// 初始化一个数据库的url,包含了数据库的关键信息
let url = "mysql://Dbuser:Pwd@Dbpath:3306/Dbname";
// 通过from_url 生成数据库参数对象
let opts = Opts::from_url(url).unwrap();

方式二:通过传参的方式进行建立

let opts = OptsBuilder::new()  
.ip_or_hostname(Some("Dbpath"))  
.user(Some("Dbuser"))  
.pass(Some("Pwd"))  
.db_name(Some("Dbname"))  
.tcp_port(3306);

2、通过数据库的参数建立一个数据库连接池

// 通过数据库参数,建立一个数据库连接池Pool
let pool = match Pool::new(opts) {Ok(p) => p,Err(e) => {eprintln!("Error {}", e);std::process::exit(1);}
};// 在连接池中建立一个新的连接
let mut conn = pool.get_conn().unwrap();

可以建立一个全局的函数生成 pool,不建议函数返回连接,因为连接池在生命周期结束后会自动清除,如果是返回连接的话就要考虑连接回收的逻辑。

数据插入

数据插入可以通过 exec_drop 的方式进行执行,以 sql 语句:insert into table (id, data) values (id, data);

conn.exec_drop("insert into table (id, data) values (:id, :data)",params! {"id" => id,"data" => data,}          ).unwrap();}

其中,params 是参数的宏定义,将 id、data 的值传入到 sql 语句的字段中。

数据查询

数据处理常用的方法有以下几种1

  • 经常使用的时间处理库:chrono
  • 流式查询使用:query_iter
  • 输出到 Vec 使用:query
  • 映射到结构体使用:query_map
  • 获取单条数据使用:query_first
  • 命名参数查询使用:exec_first
    比如查询多条数据并映射到结构体,可以使用 query_map 进行查询
let res = conn.query_map("select id, data from Dbname;",|(id, data)| Struct {id: id,data: data,},).expect("query failed.");

上述代码执行完成后,res 为 Vec ,query_map会将查询内容封装成 Struct 并插入到一个 Vec 中。

查询单条数据并映射到结构体中,可以使用query_first进行查询

let res = conn.exec_first("SELECT id, data from Dbname WHERE id = : queryid;", params! {"queryid" => id as u8},).map(|row| {row.map(|(id, data)| Struct {id: id,Data: data,})},);

返回值 res 类型是 Result<Option, Err>

数据更新

数据更新的方式与插入一致,如下:

let stmt = conn.prep("UPDATE Dbname SET data = : data WHERE id = : queryid").unwrap();let res = conn.exec_drop(&stmt, params! {"data" => data,"queryid" => id            }).unwrap();

数据清除

删除功能暂未用到,所以没有用例,不过具体使用方式与更新是一致的。

引用资料


  1. 1 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/6014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可靠的智能组网系统有哪些?

天联是一种可靠的智能组网解决方案&#xff0c;在现今复杂网络环境下具备明显的优势。本文将介绍天联组网以及其所带来的诸多优势。 天联组网的优势 天联组网具有以下优势&#xff0c;使其成为一种可靠的智能组网方案&#xff1a; 无网络限制&#xff1a;天联组网能够解决复杂…

Tire 字典树、前缀树

字典树&#xff08;又称单词查找树或Trie树&#xff09;是一种树形结构&#xff0c;它是哈希树的变种&#xff0c;通常用于统计、排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;。字典树在搜索引擎系统中常用于文本词频统计。它的主要优点在于能够利用字符串…

每日一题(力扣213):打家劫舍2--dp+分治

与打家劫舍1不同的是它最后一个和第一个会相邻&#xff0c;事实上&#xff0c;从结果思考&#xff0c;最后只会有三种&#xff1a;1 第一家不被抢 最后一家被抢 2 第一家被抢 最后一家不被抢 3 第一和最后一家都不被抢 。那么&#xff0c;根据打家劫舍1中的算法 我们能算出在i…

excel办公系列-图表元素及其作用

Excel图表元素及其作用 Excel图表由各种元素组成&#xff0c;每个元素都有其特定的作用&#xff0c;可以帮助我们更清晰地传达数据信息。下面将介绍Excel图表中常见的一些元素及其作用&#xff0c;并附上相关截图。 原始数据 月份 网站访问量 (万次&#xff09; 销售额 (万…

FIFO Generate IP核使用——Data Counts页详解

在Vivado IDE中&#xff0c;当看到一个用于设置数据计数选项的选项卡时&#xff0c;需要注意的是&#xff0c;尽管某些选项值可能因为当前的配置而显示为灰色&#xff08;即不可选或已禁用&#xff09;&#xff0c;但IDE中显示的有效范围值实际上是你可以选择的真实值。即使某些…

opencv t函数

在OpenCV中&#xff0c;t函数通常用于转置矩阵&#xff08;Transpose&#xff09;。这意味着矩阵的行和列互换位置。 在C中&#xff0c;使用OpenCV库进行矩阵转置的代码如下所示&#xff1a; #include <opencv2/opencv.hpp> #include <iostream>int main() {// 创…

《十二》Qt各种对话框之FileDialog文件对话框及QMessageBox 消息对话框

QFileDialog 对话框 选择打开一个文件 若要打开一个文件&#xff0c;可调用静态函数 QFileDialog::getOpenFileName()&#xff0c;“打开一个文件”按钮的响应代码如下&#xff1a; void Dialog::on_btnOpen_clicked() { //选择单个文件QString curPathQDir::currentPath()…

基于React实现B站评论区

今天继续来学习一下React&#xff0c;使用React实现B站评论区&#xff0c;如下图&#xff1a; 在使用React开发类似B站评论区的功能时&#xff0c;我们需要考虑以下几个关键点来构建一个基本的评论系统&#xff1a; 1. 设计组件结构 首先&#xff0c;设计组件结构是关键。至少…

Unity Animation--动画剪辑

Unity Animation--动画剪辑 动画剪辑 动画剪辑是Unity动画系统的核心元素之一。Unity支持从外部来源导入动画&#xff0c;并提供创建动画剪辑的能力使用“动画”窗口在编辑器中从头开始。 外部来源的动画 从外部来源导入的动画剪辑可能包括&#xff1a; 人形动画 运动捕捉…

Python中关于子类约束的开发规范

Python中关于子类约束的开发规范 我们知道&#xff0c;在java和C#中有一种接口的类型&#xff0c;用来约束实现该接口的类&#xff0c;必须要定义接口中指定的方法 而在python中&#xff0c;我们可以基于父类子类异常来仿照着实现这个功能 class Base:def func():raise NotI…

css---浮动知识点精炼汇总

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 浮动简单理解与介绍 这是我们普通的页面标签效果。 每个标签从上到下依次排列。 浮动顾名思义就是让这个标签飞翔起来。 他飞起来后&#xff0c;后面的标签来到他的位置上。 而浮动的标签就会显示在标签的上面。…

设计模式之MVC模式

在编程江湖闯荡多年&#xff0c;我手中打磨过的设计模式多如繁星&#xff0c;但论及经典与实用&#xff0c; MVC&#xff08;Model-View-Controller&#xff09;模式 绝对是个中翘楚&#xff01;它不仅是Web应用的骨架&#xff0c;更是软件架构的智慧结晶。今天&#xff0c;咱们…

头歌:Spark案例剖析 - 谷歌网页排名引擎PageRank实战

第1关:海量数据导入:SparkSQL大数据导入处理 任务描述 工欲善其事必先利其器,大数据分析中最重要的是熟练掌握数据导入工具的使用方法。Spark SQL是Spark自带的数据库,本关你将应用Spark SQL的数据导入工具实现文本数据的导入。其中,graphx-wiki-vertices.txt文件中含有网…

010_redhat安装zookeeper

目录 1.环境准备2.下载上传zookeeper安装包1)[官网下载zookeeper-3.6.4安装包](https://archive.apache.org/dist/zookeeper/zookeeper-3.6.4/apache-zookeeper-3.6.4-bin.tar.gz)2)创建soft文件夹 3.解压4.配置启动1、配置zoo.cfg2、启动zookeeper 小结 1.环境准备 准备一台l…

如何创建一个 Django 应用并连接到数据库

简介 Django 是一个用 Python 编写的免费开源的 Web 框架。这个工具支持可扩展性、可重用性和快速开发。 在本教程中&#xff0c;您将学习如何为一个博客网站建立与 MySQL 数据库的初始基础。这将涉及使用 django-admin 创建博客 Web 应用程序的骨架结构&#xff0c;创建 MyS…

LeetCode-网络延迟时间(Dijkstra算法)

每日一题 今天刷到一道有关的图的题&#xff0c;需要求单源最短路径&#xff0c;因此使用Dijkstra算法。 题目要求 有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 …

wordpress外贸独立站建站10要10不要

创建一个成功的WordPress外贸独立站需要注意很多因素。以下是zhanyes根据多年建站经验总结的wordpress外贸独立站建站的10个建议和10个避免的事项&#xff0c;以帮助您建立一个高质量的外贸网站&#xff1a; 10个要&#xff1a; 1. 要选择合适的域名&#xff1a;确保您的域名…

element-ui的bug记录

1.先隐藏元素再显示元素时&#xff0c;导致校验不生效的做法 <el-form-itemlabel"时间长度"prop"timeLength"v-show"form.majorFlag":rules"[{ required: form.majorFlag ? true : false, message: 时间长度不能为空, trigger: blur }…

pyppeteer 执行js函数调用ajax post传入参数并获取返回值

在Pyppeteer中&#xff0c;你可以使用page.evaluate()方法来执行JavaScript函数&#xff0c;并且可以传递参数给这个函数。如果你需要执行一个调用AJAX POST请求的函数并且传入参数&#xff0c;同时需要获取返回值&#xff0c;可以使用以下方法&#xff1a; import asyncio fr…

Mybatis-Plus学习:快速入门、核心功能、扩展功能、插件功能

文章目录 MybatisPlus快速入门快速开始常见注解常见配置 核心功能条件构造器&#xff08;Wrapper&#xff09;自定义SQLService接口基本用法基础业务接口复杂业务接口Lamda查询Lamda更新批量新增 扩展功能代码生成代码生成器快速开发插件 静态工具逻辑删除枚举处理器JSON处理器…