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