当前位置: 首页 > news >正文

开发一套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 来记录此次操作&#xff1b;git reset 是把 HEAD 指针向前挪动一次&#xff0c;会减少一个 commit。 回退用 git revert 回退还是用 git reset&#xff0c;核心就一点&#xff1a; 是否需要记录这次回退。 如果需要记录这次回退&#xff0c…...

【docker】多阶段构建与基础构建,及企业案例展示

基础构建与多阶段构建对比 基础构建&#xff08;单阶段构建&#xff09; 在基础构建中&#xff0c;所有构建过程和最终的应用程序都在同一个镜像中进行&#xff0c;构建工具和最终应用程序都会在最终镜像中。 这样构建镜像时会包含所有的构建工具和依赖&#xff0c;因此最终镜…...

基于链表的基础笔试/面试题

1. 反转链表 问题描述&#xff1a;反转一个单向链表。 示例&#xff1a; 输入&#xff1a;1 → 2 → 3 → 4 → 5 输出&#xff1a;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}; % 获取第一列数据% 划分训练集和测试集&#xff0c;80% 训练&#xff0c;20% 测试 trainSize floor(0.8 * length(y)); trainData y(1:trainSize); testData y(trainSize1:end);% 创建时间序列…...

第八课 Unity编辑器创建的资源优化_特效篇(Particle System)详解

无论是CPU还是GPU&#xff0c;粒子系统对其的影响面都是不容小觑的。随着项目的重度化和3A化&#xff0c;玩家的口味变挑剔了、游戏玩法复杂度变高了、画面的特效表现变复杂了......所以我们还是更加谨慎地对待粒子系统。 特效&#xff08;Particle System&#xff09; 游戏效…...

Oracle对比表与表之间的结构

自己首先想到的就是,navicat有提供结构同步 但是有些时候情况不一样,比如我遇到的是连接不同,而且是互相同步,以最多的列的那个表为样 没有说一个固定的源 那么还可以通过导出表结构去另一个库中执行看是否报错,以此来判断结构的不同 但是我感觉有点儿麻烦 最后想到通过sql语…...

基于JSP+MySQL的网上招聘系统的设计与实现

摘要 在这样一个经济飞速发展的时代&#xff0c;人们的生存与生活问题已成为当代社会需要关注的一个焦点。对于一个刚刚 踏入社会的年轻人来说&#xff0c;他对就业市场和形势了解的不够详细&#xff0c;同时对自己的职业规划也很模糊&#xff0c;这就导致大量的 时间被花费在…...

【Linux】进程地址空间(虚拟地址vs物理地址vs页表)

Linux 进程概念补充【Linux】 进程是什么&#xff08;不熟悉的兄弟可以看看&#xff09;。 1. C/C内存分布图 对于有c/c基础的同学相信对上面的图片并不陌生&#xff0c;实际上其描述的并不是正真的物理内存&#xff0c;而是虚拟内存&#xff0c;我们把它叫做进程地址空间 。 2…...

pytorch 融合 fuse 学习笔记

目录 fuse_lora 作用是什么 fuse_modules源码解读 fuse_lora 作用是什么 在深度学习模型微调场景下&#xff08;与 LoRA 相关&#xff09; 参数融合功能 在使用 LoRA&#xff08;Low - Rank Adaptation&#xff09;对预训练模型进行微调后&#xff0c;fuse_lora函数的主要作…...

在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程

在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程 在 Ubuntu 20.04 上使用 Lux 下载 Bilibili&#xff08;哔哩哔哩&#xff09;视频的完整和详细步骤如下&#xff0c;包括使用预编译二进制文件的安装方法&#xff1a; 1. 安装依赖 确保你的系统已安装 FFmpeg&…...

【eclipse】快捷键

【eclipse】快捷键 编辑导航重构调试复制其他快速生成 Eclipse 提供了丰富的快捷键来帮助开发者提高工作效率。 以下是一些常用的 Eclipse 快捷键&#xff0c;它们覆盖了编辑、导航、重构、调试等多个方面。 这些快捷键能够显著提升开发效率&#xff0c;尤其是在处理大型项目时…...

集成开发环境(IDE)的使用技巧插件配置

在开发过程中&#xff0c;集成开发环境&#xff08;IDE&#xff09;的使用技巧和插件配置对提高工作效率、优化代码质量和加速调试至关重要。 一、IDE使用技巧 1. 代码导航 跳转到定义&#xff08;Go to Definition&#xff09;&#xff1a;快速跳转到函数、类或变量的定义位…...

【如何提升代码工程质量】code review篇

应该对于基本上所有软件相关的公司来说&#xff0c;都有committer机制&#xff0c;即代码写好之后会提交合并请求&#xff0c;待相关人员code review通过后再进行合入&#xff0c;所以code review就是代码合入代码仓库的最后一道关卡&#xff0c;对于代码质量的影响也是不容忽视…...

Qt 面试题学习13_2024-12-1

Qt 面试题 1、 QString与基本数据类型如何转换?2、常用数据结构3、进程之间的道信方式有哪些? 1、 QString与基本数据类型如何转换? 1、将QString转换为基本数据类型通过QString的各种转换函数&#xff0c;可以将QString转换为int、float、double等基本数据类型。 QStri…...

Hive 安装与架构详解

Hive 安装&#xff08;基于 Ubuntu 系统&#xff09; 为了学习 Hive 的相关操作&#xff0c;我们需要先安装 Hive&#xff0c;以下是基于 Ubuntu 系统安装 Hive 的步骤&#xff1a; 下载 Hive 我们将使用 hive-0.13.1-cdh5.3.2 版本&#xff0c;当然你可以根据需要下载最新的…...

前端入门指南:模块打包器是什么?模块打包器的工作原理与实践

前言 在前端开发的生态系统中&#xff0c;随着项目复杂度和规模的不断提升&#xff0c;代码管理和优化变得至关重要。模块化开发作为一种有效的代码组织方式&#xff0c;极大地提升了代码的可维护性和复用性。 然而&#xff0c;面对大量的模块和复杂的依赖关系&#xff0c;如…...

初识ProtoBuf以及环境搭建(Win和Ubuntu)

初始ProtoBuf 序列化和反序列化的概念 序列化&#xff1a;把对象转换为字节序列的过程 称为对象的序列化。 反序列化&#xff1a;把字节序列恢复为对象的过程 称为对象的反序列化。 什么情况下需要序列化和反序列化&#xff1f; 存储数据&#xff1a;当你想把的内存中的对象状…...

springboot366高校物品捐赠管理系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 高校物品捐赠管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff…...

【Python网络爬虫笔记】5-(Request 带参数的get请求) 爬取豆瓣电影排行信息

目录 1.抓包工具查看网站信息2.代码实现3.运行结果 1.抓包工具查看网站信息 请求路径 url:https://movie.douban.com/typerank请求参数 页面往下拉&#xff0c;出现新的请求结果&#xff0c;参数start更新&#xff0c;每次刷新出20条新的电影数据 2.代码实现 # 使用网络爬…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...