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

发布于:2024-05-06 ⋅ 阅读:(40) ⋅ 点赞:(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 ↩︎


网站公告

今日签到

点亮在社区的每一天
去签到