开发一套ERP 第七弹 RUst 操作数据库

感谢AI

rust 复制代码
use std::fmt::format;
use mysql::*;
use lazy_static::lazy_static;
use std::sync::Mutex;
use std::thread::sleep;
use std::time::Duration;
use log::log;
use mysql::prelude::Queryable;
use data::base::{ListData,SqlInstance};
use crate::data;

lazy_static! {
    pub static ref MYSQL_USER:Mutex<String> = Mutex::new(String::from("root"));
    pub static ref MYSQL_PASSWORD:Mutex<String> = Mutex::new(String::from("123456"));
    pub static ref MYSQL_POOL: Mutex<Pool> = Mutex::new(Pool::new
        (format!("mysql://{}:{}@localhost::3306/ERP",MYSQL_USER.lock().unwrap().as_str(),
            MYSQL_PASSWORD.lock().unwrap().as_str()).as_str())
        .expect("Connection to Mysql Error"));
}

//FIXME: 链接出错直接关闭回收链接错误
#[allow(non_snake_case)]
fn MysqlPoolConnect(max_retries:i32,delay:u64) -> Result<PooledConn> {
    let mut attempts = 0;
    let retry_delay = Duration::from_secs(delay);  // 设置重试的间隔时间
    loop {
        attempts += 1;
        let pool = MYSQL_POOL.lock()?;
        let conn_result = pool.get_conn();
        match conn_result {
            Ok(conn) => {
                return Ok(conn);
            }
            Err(err) => {
                if attempts >= max_retries {
                    return Err(err);
                }
                eprintln!("Failed to connect to database, attempt {} of {}: {}", attempts, max_retries, err);
                sleep(retry_delay);
            }
        }
    }
}

#[allow(non_snake_case)]
pub fn MysqlPoolSql(query:&mut SqlInstance){
   match MysqlPoolConnect(3,1) {
       Ok(mut pool) => {
           query.buffer = pool.query_map(query.filter.as_str(),|(id,name)| ListData { id,name, name_and_color: "".to_string(), avatar: "".to_string(), zh_size: "".to_string(), u_size: "".to_string(), factory_name: "".to_string(), output: 0, input: 0, diff: 0, threshold: 0, inputDate: "".to_string(), outputDate: "".to_string() }).unwrap();
       }
       Err(err) => {
            query.result = false;
            eprintln!("Failed to connect to database: {}", err);
       }
   }
}

Rust 的全局静态挺麻烦,语言默认是非安全的操作

Rust 有spdlog的 日志封装

相关推荐
用户2018792831678 分钟前
通俗故事:驱动二进制文件在AOSP中的角色
android
穷人小水滴10 分钟前
在 Termux 中签名 apk 文件
android·linux·apk
用户20187928316711 分钟前
android王国的 “城堡攻防战”
android
还是一只小牛12 分钟前
探秘 React Native:线程探索及桥优化
android·前端
DoubleYellowIce13 分钟前
一个简单的跨进程通信SDK
android
用户20187928316715 分钟前
故事:从出厂镜像中“挖矿”驱动二进制
android
陪我一起学编程1 小时前
关于ORM增删改查的总结——跨表
数据库·后端·python·django·restful
网络点点滴1 小时前
上传一个菜谱-最后部分(项目完结)
android·okhttp
农业工作者1 小时前
Android:使用OkHttp
android·okhttp
天空之城夢主1 小时前
PostgreSQL 初体验
数据库·postgresql