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

avatar
作者
猴君
阅读量:0

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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!