开发一套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.代码实现 # 使用网络爬…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...




