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

在这里插入图片描述

普通笔记本就可以存好多
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/927220.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】基于RTOS的设计中的堆栈溢出(Stack Overflow)-第1部分

本文由RTOS专家Jean J. Labrosse撰写。 基于RTOS的应用程序中的每个任务都需要自己的堆栈,堆栈的大小取决于任务的要求(例如,函数调用嵌套、传递给函数的参数、局部变量等)。 为了避免堆栈溢出,开发人员需要过度分配堆栈空间,但不要太多,以避免浪费RAM。 什么是堆栈溢…

基于java+SpringBoot+Vue的教学辅助平台设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

mfc110u.dll是什么意思,mfc110u.dll丢失解决方法大全详解

mfc110u.dll是Microsoft Foundation Classes (MFC)库的一个特定版本&#xff08;版本11.0&#xff09;的Unicode动态链接库文件。MFC是Microsoft为C开发者设计的一个应用程序框架&#xff0c;主要用于简化Windows应用程序的开发工作。这个框架封装了很多Windows API函数&#x…

MySQL查看日志

目录 1. 日志 1.1 错误日志 1.2 二进制日志 1.2.1 介绍 1.2.2 格式 1.2.3 查看 1.2.4 删除 1.3 查询日志 1.4 慢查询日志 1. 日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过…

API平台建设之路:从0到1的实践指南

在这个互联网蓬勃发展的时代&#xff0c;API已经成为连接各个系统、服务和应用的重要纽带。搭建一个优质的API平台不仅能为开发者提供便利&#xff0c;更能创造可观的商业价值。让我们一起探讨如何打造一个成功的API平台。 技术架构是API平台的根基。选择合适的技术栈对平台的…

【组件封装】uniapp vue3 封装一个自定义下拉刷新组件pullRefresh,带刷新时间和加载动画教程

文章目录 前言一、实现原理二、组件样式和功能设计三、scroll-view 自定义下拉刷新使用回顾相关属性&#xff1a;最终版完整代码&#xff1a; 前言 手把手教你封装一个移动端 自定义下拉刷新组件带更新时间和加载动画&#xff08;PullRefresh&#xff09;&#xff0c;以uniapp …

2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素

三要素之间关系&#xff1a; 有了虚拟场景Scene&#xff0c;相机录像Camera&#xff0c;在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene&#xff1a; 这个场景为三要素之一&#xff0c;一切需要展示的东西都需…

Unity中的数学应用 之 插值函数处理角色朝向 (初中难度 +Matlab)

CodeMonkey教程&#xff1a; https://www.youtube.com/watch?vQDWlGOocKm8 Siki学院汉化教程&#xff1a;如何使用Unity开发分手厨房&#xff08;胡闹厨房&#xff09;-Unity2023 - SiKi学院|SiKi学堂 - unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程 版本&am…

2-2-18-7 QNX 系统架构-动态链接

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…

PPT不能编辑,按钮都是灰色,怎么办?

PPT文件打开之后&#xff0c;发现无法编辑&#xff0c;再仔细查看发现工具栏中的功能按钮都是灰色的&#xff0c;无法使用&#xff0c;这是什么原因&#xff1f;该如何解决&#xff1f; 原因&#xff1a;无法编辑PPT文件&#xff0c;并且功能按钮都是灰色&#xff0c;这是因为…

PMP–一、二、三模、冲刺–分类–8.质量管理

文章目录 技巧五、质量管理 一模8.质量管理--质量管理计划--质量管理计划包括项目采用的质量标准&#xff0c;到底有没有满足质量需求&#xff0c;看质量标准即可。6、 [单选] 自项目开始以来&#xff0c;作为项目经理同事的职能经理一直公开反对该项目&#xff0c;在讨论项目里…

深度学习中的生成对抗网络(GAN)原理与应用

引言 生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;简称GAN&#xff09;是由Ian Goodfellow等人在2014年提出的一种深度学习模型&#xff0c;它通过对抗训练的方式生成与真实数据分布相似的假数据。GAN的出现极大地推动了深度学习和生成模型的研究&…

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…

macOS无法打开未验证安装包的解决方案:无法打开‘XXX.pkg’,因为无法验证其是否包含可能危害Mac安全或泄漏隐私的恶意软件

macOS无法打开未验证安装包的解决方案&#xff1a;无法打开‘XXX.pkg’&#xff0c;因为无法验证其是否包含可能危害Mac安全或泄漏隐私的恶意软件 在macOS Ventura及以上版本中&#xff0c;系统安全性进一步加强&#xff0c;默认情况下不允许运行未验证或未签名的应用程序。当…

Springboot项目搭建(8)-用户登出与个人中心修改

1.提要信息 1.1 catch和then方法 then和catch是JavaScript中Promise对象的两个方法&#xff0c;用于处理异步操作的成功&#xff08;成功回调&#xff09;和失败&#xff08;失败回调&#xff09;情况。这两个方法通常与async/await语法一起使用&#xff0c;但也可以单独使用…

Android Studio 使用插件Database Navigation 连接 sqlite数据库

文章目录 Database Navigation 简介一&#xff0c;Database Navigation 下载二&#xff0c;将sqlite数据库文件存放到本地三&#xff0c;连接sqlite数据库四&#xff0c;使用SQL语句查看数据 Database Navigation 简介 Database Navigation 是一款在 Android Studio 开发环境中…

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据&#xff0c;笔者在今年10月写了文章&#xff0c;怎么使用配置化实现kafka的装载&#xff1a;springboot kafka多数据源&#xff0c;通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中&#xff0c;kafka broker是加密的&#xff0c…

ansible使用说明

将安装包拷贝到主控端主机 在主控端主机安装ansible&#xff0c;sh setup.sh 确认安装成功后&#xff0c;编辑hosts文件&#xff08;按步骤逐个添加主机组&#xff0c;不要一开始全部配置好&#xff09; [site-init]下的主机列表为被控制的主机&#xff08;按照当前ai建模方案…

5G学习笔记之PRACH

即使是阴天&#xff0c;也要记得出门晒太阳哦 目录 1. 概述 2. PRACH Preamble 3. PRACH Preamble 类型 3.1 长前导码 3.2 短前导码 3.3 前导码格式与小区覆盖 4. PRACH时频资源 4.1 小区所有可用PRACH资源 4.2 SSB和RACH的关系 4.3 PRACH时频资源配置 1. 概述 随机接入…

单点登录深入详解之技术方案总结

技术方案之CAS认证 概述 CAS 是耶鲁大学的开源项目&#xff0c;宗旨是为 web 应用系统提供一种可靠的单点登录解决方案。 CAS 从安全性角度来考虑设计&#xff0c;用户在 CAS 输入用户名和密码之后通过ticket进行认证&#xff0c;能够有效防止密码泄露。 CAS 广泛使用于传统应…