阅读量: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 ↩︎