开辟一套ERP 第八弹 RUst 插入数据

打印 上一主题 下一主题

主题 1003|帖子 1003|积分 3009


   更全面的报错,方便查抄错误在哪里,当代高级语言越来越智能
    照旧得看下原文档怎么操作的
    src 目次为crate 的根目次
    想在crate 中模块相互引入必要在 main 中声明,各个模块,然后才气在各个模块中相互引入和使用
    原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出现冲突,在tauri2.0 的crate 中可以进行调用和使用
  1. use super::data;
  2. use data::mysql::MysqlPoolConnect;
  3. use data::base::ListData;
  4. use mysql::params;
  5. use mysql::prelude::Queryable;
  6. pub fn test_mysql(){
  7.     match MysqlPoolConnect(3, 1) {
  8.         Ok(mut pool)=>{
  9.         let rows = vec![
  10.         ListData { id:12,name:Some("hello world".into()),
  11.         color:Some("测试颜色".into()),
  12.         name_and_color:Some("white".into()),
  13.         avatar:Some("/etc/pictures".into()),
  14.         zh_size:Some("34-43".into()),
  15.         u_size:Some("53-78".into()),
  16.         diff:100,
  17.         factory_name:Some("baidu".into()),
  18.         output:64,
  19.         input:89,
  20.         threshold:100,
  21.         input_date:Some("2024-11-29".into()),
  22.         output_date:Some("2024-11-29".into())},
  23.         ];
  24.    
  25.         println!("connect mysql service okay !!!");
  26.         println!("test struct ListData is okay?");
  27.         
  28.         for it in rows.iter() { println!("{:?}",it);}
  29.         let result = pool.exec_batch(r"INSERT INTO INBOUND(id,name,color,name_and_color,avatar,zh_size,u_size,factory_name,input,input_date)
  30.             VALUES (:id,:name,:color,:name_and_color,:avatar,:zh_size,:u_size,:factory_name,:input,:input_date)",rows.iter().map(|p| params! {
  31.                "id" => p.id,
  32.                "name" => &p.name,
  33.                "color" => &p.color,
  34.                "name_and_color" => &p.name_and_color,
  35.                "avatar" => &p.avatar,
  36.                "zh_size" => &p.zh_size,
  37.                "u_size" => &p.u_size,
  38.                "factory_name" => &p.factory_name,
  39.                "input" => p.input,
  40.                "input_date" => &p.input_date
  41.             }));
  42.             match result {
  43.                 Ok(_) => println!("Insert Into database Okay ... ..."),
  44.                 Err(e) => println!("Insert Into database error {}",e)
  45.             }
  46.        },
  47.         Err(e) => {
  48.             eprintln!("Error:{}",e);
  49.         },
  50.     }
  51. }
复制代码
  插入的数据字段最好用蛇形命名,要不容易出现,插入出错,
    数据中包含: input, inputDate ,改成蛇形命名后,可以正常插入,仅限于Rust mysql crate 的使用
    mysql 对 日期的范围筛选很友好
  1. #[allow(dead_code)]
  2. pub fn inbound_row_insert(rows:Vec<ListData>) -> Result<(),Error> {
  3.     let res;
  4.     match MysqlPoolConnect(3, 1){
  5.         Ok(mut pool) => {
  6. let result = pool.exec_batch(r"INSERT INTO INBOUND(id,name,color,name_and_color,avatar,zh_size,u_size,factory_name,input,input_date)
  7. VALUES (:id,:name,:color,:name_and_color,:avatar,:zh_size,:u_size,:factory_name,:input,:input_date)",rows.iter().map(|p| params! {
  8.    "id" => p.id,
  9.    "name" => &p.name,
  10.    "color" => &p.color,
  11.    "name_and_color" => &p.name_and_color,
  12.    "avatar" => &p.avatar,
  13.    "zh_size" => &p.zh_size,
  14.    "u_size" => &p.u_size,
  15.    "factory_name" => &p.factory_name,
  16.    "input" => p.input,
  17.    "input_date" => &p.input_date
  18. }));
  19. res = result;
  20.     },
  21. Err(e) => {res = Err(e);}
  22.     };
  23.     res
  24. }
复制代码
  在封装一层函数
    rUST 的宏定义照旧很有意思的
  1. #[macro_export]
  2. macro_rules! params {
  3.     () => {};
  4.     (@to_pair $map:expr, $name:expr => $value:expr) => (
  5.         let entry = $map.entry(std::vec::Vec::<u8>::from($name));
  6.         if let std::collections::hash_map::Entry::Occupied(_) = entry {
  7.             panic!("Redefinition of named parameter `{}'", std::string::String::from_utf8_lossy(entry.key()));
  8.         } else {
  9.             entry.or_insert($crate::value::Value::from($value));
  10.         }
  11.     );
  12.     (@to_pair $map:expr, $name:ident) => (
  13.         let entry = $map.entry(stringify!($name).as_bytes().to_vec());
  14.         if let std::collections::hash_map::Entry::Occupied(_) = entry {
  15.             panic!("Redefinition of named parameter `{}'", std::string::String::from_utf8_lossy(entry.key()));
  16.         } else {
  17.             entry.or_insert($crate::value::Value::from($name));
  18.         }
  19.     );
  20.     (@expand $map:expr;) => {};
  21.     (@expand $map:expr; $name:expr => $value:expr, $($tail:tt)*) => {
  22.         params!(@to_pair $map, $name => $value);
  23.         params!(@expand $map; $($tail)*);
  24.     };
  25.     (@expand $map:expr; $name:expr => $value:expr $(, $tail:tt)*) => {
  26.         params!(@to_pair $map, $name => $value);
  27.         params!(@expand $map; $($tail)*);
  28.     };
  29.     (@expand $map:expr; $name:ident, $($tail:tt)*) => {
  30.         params!(@to_pair $map, $name);
  31.         params!(@expand $map; $($tail)*);
  32.     };
  33.     (@expand $map:expr; $name:ident $(, $tail:tt)*) => {
  34.         params!(@to_pair $map, $name);
  35.         params!(@expand $map; $($tail)*);
  36.     };
  37.     ($i:ident, $($tail:tt)*) => {
  38.         {
  39.             let mut map: std::collections::HashMap<std::vec::Vec<u8>, $crate::value::Value, _> = std::default::Default::default();
  40.             params!(@expand (&mut map); $i, $($tail)*);
  41.             $crate::params::Params::Named(map)
  42.         }
  43.     };
  44.     ($i:expr => $($tail:tt)*) => {
  45.         {
  46.             let mut map: std::collections::HashMap<std::vec::Vec<u8>, $crate::value::Value, _> = std::default::Default::default();
  47.             params!(@expand (&mut map); $i => $($tail)*);
  48.             $crate::params::Params::Named(map)
  49.         }
  50.     };
  51.     ($i:ident) => {
  52.         {
  53.             let mut map: std::collections::HashMap<std::vec::Vec<u8>, $crate::value::Value, _> = std::default::Default::default();
  54.             params!(@expand (&mut map); $i);
  55.             $crate::params::Params::Named(map)
  56.         }
  57.     }
  58. }
复制代码
  许多的匹配原则
  

   方便的测试方法
  

   加一些测试接口,会很方便的测试接口的是否可用
    单个接口还可以看到出错的原因
  

   方遍定位错误的原因
  


   简易的查询插入接口
    Rust 的原设计不发起 函数重载
元编程使用 宏定义实现
    删除只必要根据ID 删除就行
    数据更新也是根据ID更新
    筛选查询就用点烦了,每个节点都是一个and 条件 筛选
    Rust 也支持excel 数据导出,就是格式化为 csv 最容易
    目前只必要数据交互为网络交互,其他都是本地代码,数据可以方便更换和上传
    mysql/rust/vue/docker = 可高度自定义的ERP,每个人都可以本身写,数据还安全,都是本地的,如果大点就去云上拉,浏览器不太安全的
    tauri2.0 编完才5MB 这啥概念,运存还小
  

   堪比python的易用程度
  

   比first 和 second 少打好多子,虽然都是补全
    and 一起 就可以联在一起查表了
    关键不collect 直接在map组合



相当方便
  

   直接分库分表, 有些汇总显现表缓存一个map;设置上限 4G,其他的分库分表查询,更划算;stream 处置惩罚起来 就和 往那些排序的算法上套了
    有一个blog 上说 rust 的 map 安全型号,性能不加,C++ 的 map 偶然间 insert 直接 segmentfault 都不知道咋回事儿但是rust吧,处置惩罚不好直接退出程序
  
> 查询用了30ms 这不太能忍受,产生10w 条数据测试下… …

   400ms 还okay的;目前的需求满足
  

   数据插入很慢 156s

    禁用自动提交
  

   先如许用 … …
    电脑的主频和多人还okay的,一样平常的机器上,不可的话,就的在优化大批量插入,引入多线程操作,分区同时并行插入
  

   平凡条记本就可以存好多


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表