Rust个人学习之Rust操作Mysql数据库
创始人
2024-11-12 03:04:56

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

数据更新

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

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 ↩︎

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...