mysql_quick 2.0.1

mysql 数据库快速连接方法
Documentation
mod method;
pub use method::*;

pub use regex::Regex;
pub use serde_json::{Value, from_str, to_string};

#[cfg(test)]
mod test {
    use crate::{
        MysqlQuick, MysqlQuickCount, Sql, my_run_vec, mycount, mydel, myfind, myget, myset,
        mysetmany, mysetupdate, mysetupdatemany, myupdate, myupdatemany,
    };
    use serde::{Deserialize, Serialize};

    const MYSQL_URL: &str = "mysql://root:12345678@localhost:3306/dev_db";

    #[test]
    fn test_one() {
        let mut conn = MysqlQuick::new(MYSQL_URL).unwrap().pool.get_conn().unwrap();
        let sql = mydel!("for_test", 12);
        println!("sql》》》{:?}", sql);

        let sql = mycount!("for_test", {
            p0: ["total", ">", 0],
            r: "p0",
        });
        let res_count: Vec<MysqlQuickCount> = my_run_vec(&mut conn, sql).unwrap();

        println!("测试》》》{:?}", res_count);

        let des_str = r#"#@!@$$^&^%&&#\\,abc,adflll+_)"(_)*)(32389)d(ŐдŐ๑)🍉 .',ddd"#;
        let _sql = mycount!("for_test", {
            p0: ["content", "in", des_str],
            r: "p0",
        });
        let _sql = mycount!("for_test", {
            p0: ["total", ">", 0],
            r: "p0",
            distinct: "title",
        });

        let _sql = myfind!("for_test", {
            p0: ["total", ">", 1],
            r: "p0",
            select: "distinct title as t",
        });
        let _sql = myget!("for_test", {"uid": 1});
        let _sql = myget!("for_test", 5, "id,content as cc"); // 查寻 id = 5 的数据

        let info =
            r#"m'y,,a#@!@$$33^&^%&&#\\ \ \ \ \ \ \ \\\\\$,,adflll+_)"(_)*)(32389)d(ŐдŐ๑)🍉 .',"#;
        #[derive(Serialize, Deserialize)]
        struct Item {
            content: String,
            total: u32,
            price: Option<f32>,
        }
        let vec_data = vec![
            Item {
                content: info.to_owned(),
                total: 10,
                price: Some(30.5),
            },
            Item {
                content: String::from("批量新增"),
                total: 11,
                price: None,
            },
        ];
        let _sql = mysetmany!("for_test", vec_data);

        #[derive(Serialize, Deserialize)]
        struct Item2 {
            id: u64,
            content: String,
            total: u32,
        }
        let vec_data = vec![
            Item2 {
                id: 1,
                content: "ABC".to_string(),
                total: 1,
            },
            Item2 {
                id: 2,
                content: String::from("批量更新2111"),
                total: 1,
            },
        ];
        // 当前以 id 字段为查寻条件,更新 id 分别为7、8数据的content、total为对应的值。
        let _sql = myupdatemany!("for_test", "id,+total", vec_data);

        let sql = myupdatemany!("for_test", "id,total", vec_data);
        println!("sql》》》{}", sql);

        assert!(true)
    }

    #[test]
    fn test_complex() {
        let sql = myfind!("for_test", {
            j0: ["user_id", "inner", "dev.users.id as u"],
            p0: ["content", "=", "内容"],
            p1: ["uid", "=", "1"],
            r: "p0 && p1",
        });
        println!("@@@ _1__ {}", sql);
        let sql = myfind!("for_test", {
            p0: ["content", "=", r#"' OR '1'='1'; --"#],
            p1: ["uid", "=", "1"],
            r: "p0 && p1",
        });
        println!("@@@ _2__ {}", sql);

        let sql1 = myfind!("hospital", {
            p0: ["hospital_name", "like", "院%"],
            r: "p0",
            select: "hospital_id",
        });
        let sql2 = mycount!("patient", {
            p0: ["investigation_id", "=", Sql("investigation.investigation_id")],
            r: "p0",
        });
        let sql3 = mycount!("delete_patient", {
            p0: ["investigation_id", "=", Sql("investigation.investigation_id")],
            r: "p0",
        });
        let sql = myfind!("investigation", {
            j1: ["hospital_id", "inner", "hospital.hospital_id"],
            p0: ["hospital_id", "in", Sql(sql1)],
            p1: ["inv_type", "=", "门诊"],
            r: "p0 && p1",
            select: "investigation_id, hospital_id, hospital.hospital_name, status_op_dateTime, (".to_string()
                + sql2.as_str() + ") as patient_count, ("
                + sql3.as_str() + ") as delete_patient_count",
        });
        println!("sql>>>>>  {} \n", sql);

        assert_eq!(
            sql,
            r#"SELECT investigation.investigation_id,investigation.hospital_id,hospital.hospital_name,investigation.status_op_dateTime,(SELECT count(*) as mysql_quick_count FROM patient WHERE patient.investigation_id = (investigation.investigation_id)) as patient_count,(SELECT count(*) as mysql_quick_count FROM delete_patient WHERE delete_patient.investigation_id = (investigation.investigation_id)) as delete_patient_count FROM investigation INNER JOIN hospital ON investigation.hospital_id = hospital.hospital_id WHERE (investigation.hospital_id IN (SELECT hospital.hospital_id FROM hospital WHERE hospital.hospital_name LIKE "院%" ) AND investigation.inv_type = "门诊") "#
        );
    }

    #[test]
    fn test_set() {
        let sql = myset!("for_test", {
            "name":  "wzj" ,
            "age":  32,
            "name": &Some("wzj"),
            "age": &Some(32),
        });
        println!("@@@ _1__ {}", sql);

        // #[derive(Debug)]
        // struct Userbc {
        //     phone: String,
        //     c: u32,
        // }
        // let sql = myset!("for_test", {
        //     "name": Some(Userbc{phone: "select".to_owned(), c: 3}),
        //     "age": Some((32,"select")),
        // });
        // INSERT INTO for_test ( name,age )  VALUES ( "serbc { phone: \"select\", c: 3 ",(32, "select") )
        // INSERT INTO for_test ( name,age )  VALUES ( "serbc { phone: \"select\", c: 3 ","32, \"select\"" )
        println!("@@@ 11111__ {}", sql);

        let s = 2;
        let sql = myupdate!("sku_unit", {"unit_sn": 100000}, {
            "status": &s
        });
        println!("{}", sql);

        let sql = myset!("talbe", {
           "name": r#"m'y,,a#@!@$$^&^%&&#$,,adflll+_)"(\_)*)(32389)d(ŐдŐ๑)🍉 .',"#,
           "b": Some(r#"m'y,,a#@!@$$^&^%&&#$,,adflll+_)"(\_)*)(32389)d(ŐдŐ๑)🍉 .',"#),
           "cb": "null",
        });
        println!("sql,,,  {}", sql);
    }

    #[test]
    fn test_option() {
        let age: Option<u32> = None;

        let sql = mysetupdate!("for_test", "name,age2", {
            "name": "wzj",
            "age": age,
            "name2": &Some("wzj"),
            "age2": Some(32),
            "content": "null"
        });
        println!("setupd__ {}", sql);

        let sql = myset!("for_test", {
            "name":  "wzj" ,
            "age":  age,
            "name2": &Some("wzj"),
            "age2": age,
            "content": "null"
        });
        println!("sql__ {}", sql);

        let sql = myupdate!("for_test", {"cid": 3}, {
            "name": ["set", "wzj"],
            "age": ["set", age],
            "name2":["set", &Some("wzj")],
            "age2": ["incr", Some(32)],
            "content": ["set", "null"]
        });
        println!("sql22__ {}", sql);

        let sql = myupdate!("for_test", 3, {
            "name": ["set", "wzj"],
            "age": ["set", age],
            "name2":["set", &Some("wzj")],
            "age2": ["incr", Some(32)],
            "content": ["set", "null"]
        });
        println!("sql22__ {}", sql);

        let sql = myupdate!("for_test", {"cid": 3}, {
            "name": "wzj",
            "age": age,
            "name2": &Some("wzj"),
            "age2": Some(32),
            "content": "null"
        });
        println!("sql22__ {}", sql);

        let sql = myupdate!("for_test", 3, {
            "name": "wzj",
            "age": age,
            "name2": &Some("wzj"),
            "age2": Some(32),
            "content": "null"
        });
        println!("sql22__ {}", sql);

        #[derive(Serialize, Deserialize)]
        struct Item {
            content: String,
            total: u32,
            price: Option<f32>,
        }
        let vec_data = vec![
            Item {
                content: String::from("批量22新增"),
                total: 10,
                price: Some(30.5),
            },
            Item {
                content: "null".to_string(),
                total: 11,
                price: None,
            },
        ];
        let sql = mysetmany!("for_test", vec_data);
        println!("mysetmany__ {}", sql);
        let sql = mysetupdatemany!("for_test", "total,price", vec_data);
        println!("mysetupdatemany__ {}", sql);

        #[derive(Serialize, Deserialize)]
        struct Item2 {
            id: u64,
            content: Option<String>,
            total: u32,
        }
        let vec_data = vec![
            Item2 {
                id: 1,
                content: Some("ABC".to_string()),
                total: 1,
            },
            Item2 {
                id: 2,
                content: Some("null".to_string()),
                total: 1,
            },
        ];
        // 当前以 id 字段为查寻条件,更新 id 分别为7、8数据的content、total为对应的值。
        let sql = myupdatemany!("for_test", "id,+total", vec_data);
        println!("\nsql_aa_ {}", sql);

        let sql = myupdatemany!("for_test", "id,total", vec_data);
        println!("\nsql_bb_ {}", sql);
    }
}