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

更全面的报错,方便检查错误在哪里,现代高级语言越来越智能
还是得看下原文档怎么操作的
src 目录为crate 的根目录
想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用
原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出现冲突,在tauri2.0 的crate 中可以进行调用和使用
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 对 日期的范围筛选很友好
#[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 的宏定义还是很有意思的
#[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的,一般的机器上,不行的话,就的在优化大批量插入,引入多线程操作,分区同时并行插入

普通笔记本就可以存好多
相关文章:
开发一套ERP 第八弹 RUst 插入数据
更全面的报错,方便检查错误在哪里,现代高级语言越来越智能 还是得看下原文档怎么操作的 src 目录为crate 的根目录 想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用 原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出…...
回退用 git revert 还是 git reset?
git revert 会生成一个新的 commit 来记录此次操作;git reset 是把 HEAD 指针向前挪动一次,会减少一个 commit。 回退用 git revert 回退还是用 git reset,核心就一点: 是否需要记录这次回退。 如果需要记录这次回退,…...
【docker】多阶段构建与基础构建,及企业案例展示
基础构建与多阶段构建对比 基础构建(单阶段构建) 在基础构建中,所有构建过程和最终的应用程序都在同一个镜像中进行,构建工具和最终应用程序都会在最终镜像中。 这样构建镜像时会包含所有的构建工具和依赖,因此最终镜…...
基于链表的基础笔试/面试题
1. 反转链表 问题描述:反转一个单向链表。 示例: 输入:1 → 2 → 3 → 4 → 5 输出:5 → 4 → 3 → 2 → 1 class ListNode {int val;ListNode next;ListNode(int x) {val x;} }public class LinkedList {public ListNode …...
SARIMA 模型Matlab代码
% 导入数据 data readtable(data.xlsx); % 假设数据在第一列 y data{:, 1}; % 获取第一列数据% 划分训练集和测试集,80% 训练,20% 测试 trainSize floor(0.8 * length(y)); trainData y(1:trainSize); testData y(trainSize1:end);% 创建时间序列…...
第八课 Unity编辑器创建的资源优化_特效篇(Particle System)详解
无论是CPU还是GPU,粒子系统对其的影响面都是不容小觑的。随着项目的重度化和3A化,玩家的口味变挑剔了、游戏玩法复杂度变高了、画面的特效表现变复杂了......所以我们还是更加谨慎地对待粒子系统。 特效(Particle System) 游戏效…...
Oracle对比表与表之间的结构
自己首先想到的就是,navicat有提供结构同步 但是有些时候情况不一样,比如我遇到的是连接不同,而且是互相同步,以最多的列的那个表为样 没有说一个固定的源 那么还可以通过导出表结构去另一个库中执行看是否报错,以此来判断结构的不同 但是我感觉有点儿麻烦 最后想到通过sql语…...
基于JSP+MySQL的网上招聘系统的设计与实现
摘要 在这样一个经济飞速发展的时代,人们的生存与生活问题已成为当代社会需要关注的一个焦点。对于一个刚刚 踏入社会的年轻人来说,他对就业市场和形势了解的不够详细,同时对自己的职业规划也很模糊,这就导致大量的 时间被花费在…...
【Linux】进程地址空间(虚拟地址vs物理地址vs页表)
Linux 进程概念补充【Linux】 进程是什么(不熟悉的兄弟可以看看)。 1. C/C内存分布图 对于有c/c基础的同学相信对上面的图片并不陌生,实际上其描述的并不是正真的物理内存,而是虚拟内存,我们把它叫做进程地址空间 。 2…...
pytorch 融合 fuse 学习笔记
目录 fuse_lora 作用是什么 fuse_modules源码解读 fuse_lora 作用是什么 在深度学习模型微调场景下(与 LoRA 相关) 参数融合功能 在使用 LoRA(Low - Rank Adaptation)对预训练模型进行微调后,fuse_lora函数的主要作…...
在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程
在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程 在 Ubuntu 20.04 上使用 Lux 下载 Bilibili(哔哩哔哩)视频的完整和详细步骤如下,包括使用预编译二进制文件的安装方法: 1. 安装依赖 确保你的系统已安装 FFmpeg&…...
【eclipse】快捷键
【eclipse】快捷键 编辑导航重构调试复制其他快速生成 Eclipse 提供了丰富的快捷键来帮助开发者提高工作效率。 以下是一些常用的 Eclipse 快捷键,它们覆盖了编辑、导航、重构、调试等多个方面。 这些快捷键能够显著提升开发效率,尤其是在处理大型项目时…...
集成开发环境(IDE)的使用技巧插件配置
在开发过程中,集成开发环境(IDE)的使用技巧和插件配置对提高工作效率、优化代码质量和加速调试至关重要。 一、IDE使用技巧 1. 代码导航 跳转到定义(Go to Definition):快速跳转到函数、类或变量的定义位…...
【如何提升代码工程质量】code review篇
应该对于基本上所有软件相关的公司来说,都有committer机制,即代码写好之后会提交合并请求,待相关人员code review通过后再进行合入,所以code review就是代码合入代码仓库的最后一道关卡,对于代码质量的影响也是不容忽视…...
Qt 面试题学习13_2024-12-1
Qt 面试题 1、 QString与基本数据类型如何转换?2、常用数据结构3、进程之间的道信方式有哪些? 1、 QString与基本数据类型如何转换? 1、将QString转换为基本数据类型通过QString的各种转换函数,可以将QString转换为int、float、double等基本数据类型。 QStri…...
Hive 安装与架构详解
Hive 安装(基于 Ubuntu 系统) 为了学习 Hive 的相关操作,我们需要先安装 Hive,以下是基于 Ubuntu 系统安装 Hive 的步骤: 下载 Hive 我们将使用 hive-0.13.1-cdh5.3.2 版本,当然你可以根据需要下载最新的…...
前端入门指南:模块打包器是什么?模块打包器的工作原理与实践
前言 在前端开发的生态系统中,随着项目复杂度和规模的不断提升,代码管理和优化变得至关重要。模块化开发作为一种有效的代码组织方式,极大地提升了代码的可维护性和复用性。 然而,面对大量的模块和复杂的依赖关系,如…...
初识ProtoBuf以及环境搭建(Win和Ubuntu)
初始ProtoBuf 序列化和反序列化的概念 序列化:把对象转换为字节序列的过程 称为对象的序列化。 反序列化:把字节序列恢复为对象的过程 称为对象的反序列化。 什么情况下需要序列化和反序列化? 存储数据:当你想把的内存中的对象状…...
springboot366高校物品捐赠管理系统(论文+源码)_kaic
毕 业 设 计(论 文) 高校物品捐赠管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此ÿ…...
【Python网络爬虫笔记】5-(Request 带参数的get请求) 爬取豆瓣电影排行信息
目录 1.抓包工具查看网站信息2.代码实现3.运行结果 1.抓包工具查看网站信息 请求路径 url:https://movie.douban.com/typerank请求参数 页面往下拉,出现新的请求结果,参数start更新,每次刷新出20条新的电影数据 2.代码实现 # 使用网络爬…...
基于MCP协议与向量数据库构建AI编程助手私有记忆系统
1. 项目概述:为你的AI编程助手打造一个“记忆宫殿”如果你和我一样,重度依赖Cursor这类AI编程助手,那你肯定遇到过这个痛点:昨天刚和它深入讨论过一个复杂的业务逻辑实现,今天想参考一下,却发现在浩如烟海的…...
别再复制粘贴了!手把手教你用MATLAB/Simulink把低通滤波器写成C代码(附避坑指南)
从MATLAB到嵌入式C:低通滤波器工程化实现全指南 在嵌入式系统开发中,数字滤波器的实现往往成为算法落地的关键瓶颈。许多工程师能够熟练使用MATLAB设计出完美的滤波器模型,却在将其转化为实际可用的C代码时频频碰壁——仿真曲线平滑优美&…...
3分钟快速上手:开源AIOps告警管理平台keep终极实战指南
3分钟快速上手:开源AIOps告警管理平台keep终极实战指南 【免费下载链接】keep The open-source AIOps and alert management platform 项目地址: https://gitcode.com/GitHub_Trending/kee/keep 你是否曾经被海量的监控告警淹没,在Prometheus、Gr…...
jQuery WeUI移动端UI组件库架构解析与实现原理深度指南
jQuery WeUI移动端UI组件库架构解析与实现原理深度指南 【免费下载链接】jquery-weui 由于前端业界早已以React/Vue/Angular为主,个人也多年未使用过jQuery,此仓库已不再维护。推荐大家尽快转向 AntD、Element等更先进的UI库,https://ant.des…...
IntelliNode:统一AI模型调用,加速Node.js智能应用开发
1. 项目概述:从IntelliNode到智能应用开发的新范式最近在开源社区里,一个名为“IntelliNode”的项目引起了我的注意,更具体地说,是它的核心库intelligentnode/Intelli。乍一看这个名字,你可能会联想到“智能节点”&…...
芯片巨头并购软件公司:从硬件竞赛到软硬协同的产业变革
1. 行业现象背后的深层逻辑最近和几个在芯片设计公司和EDA软件公司工作的老朋友聊天,大家不约而同地提到了一个趋势:芯片巨头们的手,伸得越来越长了。以前是买IP核、买制造厂,现在则是频频出手,将一家家软件公司收入囊…...
ppt模板_0013_66tm黑色--运动
PPT模板分享...
终极指南:如何使用OpenCore Legacy Patcher让旧款Mac焕发新生
终极指南:如何使用OpenCore Legacy Patcher让旧款Mac焕发新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为你的老款Mac无法升级最新macO…...
【20年架构老兵亲授】:SITS 2026服务边界定义三原则、8类AI上下文耦合陷阱及动态治理沙盒实测数据
更多请点击: https://intelliparadigm.com 第一章:AI原生微服务架构:SITS 2026服务拆分与治理策略 AI原生微服务并非传统微服务的简单升级,而是以模型生命周期、推理上下文感知和实时反馈闭环为驱动的服务边界重构。SITS 2026&am…...
告别混乱!WPF项目如何用ResourceDictionary优雅管理样式和转换器(附完整项目结构)
告别混乱!WPF项目如何用ResourceDictionary优雅管理样式和转换器(附完整项目结构) 当WPF项目从Demo阶段步入正式开发,资源管理往往会成为第一个"拦路虎"。我曾接手过一个中型设备管理系统的UI重构,打开项目时…...




