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

更全面的报错,方便检查错误在哪里,现代高级语言越来越智能
还是得看下原文档怎么操作的
src 目录为crate 的根目录
想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用
原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出现冲突,在tauri2.0 的crate 中可以进行调用和使用

rust 复制代码
use super::data;
use data::mysql::MysqlPoolConnect;
use data::base::ListData;
use mysql::params;
use mysql::prelude::Queryable;

pub fn test_mysql(){
    match MysqlPoolConnect(3, 1) {
        Ok(mut pool)=>{

        let rows = vec![
        ListData { id:12,name:Some("hello world".into()),
        color:Some("测试颜色".into()),
        name_and_color:Some("white".into()),
        avatar:Some("/etc/pictures".into()),
        zh_size:Some("34-43".into()),
        u_size:Some("53-78".into()),
        diff:100,
        factory_name:Some("baidu".into()),
        output:64,
        input:89,
        threshold:100,
        input_date:Some("2024-11-29".into()),
        output_date:Some("2024-11-29".into())},
        ];
    
        println!("connect mysql service okay !!!");
        println!("test struct ListData is okay?");
        
        for it in rows.iter() { println!("{:?}",it);}
        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)
            VALUES (:id,:name,:color,:name_and_color,:avatar,:zh_size,:u_size,:factory_name,:input,:input_date)",rows.iter().map(|p| params! {
               "id" => p.id,
               "name" => &p.name,
               "color" => &p.color,
               "name_and_color" => &p.name_and_color,
               "avatar" => &p.avatar,
               "zh_size" => &p.zh_size,
               "u_size" => &p.u_size,
               "factory_name" => &p.factory_name,
               "input" => p.input,
               "input_date" => &p.input_date
            }));
            match result {
                Ok(_) => println!("Insert Into database Okay ... ..."),
                Err(e) => println!("Insert Into database error {}",e)
            }
       },
        Err(e) => {
            eprintln!("Error:{}",e);
        },
    }
}

插入的数据字段最好用蛇形命名,要不容易出现,插入出错,
数据中包含: input, inputDate ,改成蛇形命名后,可以正常插入,仅限于Rust mysql crate 的使用
mysql 对 日期的范围筛选很友好

rust 复制代码
#[allow(dead_code)]
pub fn inbound_row_insert(rows:Vec<ListData>) -> Result<(),Error> {
    let res;
    match MysqlPoolConnect(3, 1){
        Ok(mut pool) => {
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)
VALUES (:id,:name,:color,:name_and_color,:avatar,:zh_size,:u_size,:factory_name,:input,:input_date)",rows.iter().map(|p| params! {
   "id" => p.id,
   "name" => &p.name,
   "color" => &p.color,
   "name_and_color" => &p.name_and_color,
   "avatar" => &p.avatar,
   "zh_size" => &p.zh_size,
   "u_size" => &p.u_size,
   "factory_name" => &p.factory_name,
   "input" => p.input,
   "input_date" => &p.input_date
}));
res = result;
    },
Err(e) => {res = Err(e);}
    };
    res
}

在封装一层函数
rUST 的宏定义还是很有意思的

rust 复制代码
#[macro_export]
macro_rules! params {
    () => {};
    (@to_pair $map:expr, $name:expr => $value:expr) => (
        let entry = $map.entry(std::vec::Vec::<u8>::from($name));
        if let std::collections::hash_map::Entry::Occupied(_) = entry {
            panic!("Redefinition of named parameter `{}'", std::string::String::from_utf8_lossy(entry.key()));
        } else {
            entry.or_insert($crate::value::Value::from($value));
        }
    );
    (@to_pair $map:expr, $name:ident) => (
        let entry = $map.entry(stringify!($name).as_bytes().to_vec());
        if let std::collections::hash_map::Entry::Occupied(_) = entry {
            panic!("Redefinition of named parameter `{}'", std::string::String::from_utf8_lossy(entry.key()));
        } else {
            entry.or_insert($crate::value::Value::from($name));
        }
    );
    (@expand $map:expr;) => {};
    (@expand $map:expr; $name:expr => $value:expr, $($tail:tt)*) => {
        params!(@to_pair $map, $name => $value);
        params!(@expand $map; $($tail)*);
    };
    (@expand $map:expr; $name:expr => $value:expr $(, $tail:tt)*) => {
        params!(@to_pair $map, $name => $value);
        params!(@expand $map; $($tail)*);
    };
    (@expand $map:expr; $name:ident, $($tail:tt)*) => {
        params!(@to_pair $map, $name);
        params!(@expand $map; $($tail)*);
    };
    (@expand $map:expr; $name:ident $(, $tail:tt)*) => {
        params!(@to_pair $map, $name);
        params!(@expand $map; $($tail)*);
    };
    ($i:ident, $($tail:tt)*) => {
        {
            let mut map: std::collections::HashMap<std::vec::Vec<u8>, $crate::value::Value, _> = std::default::Default::default();
            params!(@expand (&mut map); $i, $($tail)*);
            $crate::params::Params::Named(map)
        }
    };
    ($i:expr => $($tail:tt)*) => {
        {
            let mut map: std::collections::HashMap<std::vec::Vec<u8>, $crate::value::Value, _> = std::default::Default::default();
            params!(@expand (&mut map); $i => $($tail)*);
            $crate::params::Params::Named(map)
        }
    };
    ($i:ident) => {
        {
            let mut map: std::collections::HashMap<std::vec::Vec<u8>, $crate::value::Value, _> = std::default::Default::default();
            params!(@expand (&mut map); $i);
            $crate::params::Params::Named(map)
        }
    }
}

很多的匹配原则

方便的测试方法

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

方遍定位错误的原因


简易的查询插入接口
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的,一般的机器上,不行的话,就的在优化大批量插入,引入多线程操作,分区同时并行插入

普通笔记本就可以存好多

相关推荐
iamBailey5 分钟前
无核显主机U盘安装Ubuntu和N卡驱动和cuda-toolkit踩坑记录
linux·运维·ubuntu
坐井观老天11 分钟前
在 Ubuntu 20.04 上安装和使用GCC/G++
linux·ubuntu
sup爱豆的笑容13 分钟前
Hackathon靶机系列Hackathon2
linux·网络·安全·web安全
努力努力不秃头!27 分钟前
【Linux相关】服务器无网情况配置conda
linux·服务器·python·ubuntu·http·ssh·conda
哲学之窗43 分钟前
matlab 中的 bug
linux·前端·bug
LateBloomer7771 小时前
Linux进程操作(上)
linux·笔记·学习·ubuntu·操作系统
皓月盈江2 小时前
wordpress网站首页底部栏显示网站备案信息
linux·服务器·wordpress·网站备案·footer.php·主题编辑器·网站底部添加备案信息
想和我重名?3 小时前
Linux下的wlan0控制
linux·嵌入式
LeonNo113 小时前
Linux:systemd进程管理【1】
linux·运维·服务器