#sql #condition #tool #macro #options #proc #sql-query

to_sql_condition

一个简单的生成SQL条件过程宏

5个版本

0.2.1 2023年3月17日
0.1.4 2023年3月14日

#640 in 过程宏

Download history 14/week @ 2024-04-03 102/week @ 2024-04-10 3/week @ 2024-04-24 1/week @ 2024-05-22 9/week @ 2024-05-29 1/week @ 2024-06-05 5/week @ 2024-06-26 60/week @ 2024-07-03

每月 65 次下载

MIT 许可证

11KB
171

to_sql_condition

"To_sql_condition" 是一个方便的派生宏,用于生成SQL查询条件,减少了手动编码的工作量。然而,它目前功能有限,只能支持一些功能,如WHERE和LIMIT。

使用方法

表格

CREATE TABLE `od_commands` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

也许我们想使用某些文件中的查询命令。在Rust中,我们可以创建一个结构体来处理这个问题。

use core::option;
use to_sql_condition::ToSqlCondition;

#[derive(ToSqlCondition, Debug)]
struct Query {
    id: ::core::option::Option<i32>,
    name: option::Option<String>,
    offset: Option<u32>,
    limit: Option<u32>,
}

#[derive(ToSqlCondition, Debug)]
struct QueryNoOption {
    id: i32,
    name: String,
    offset: u32,
    limit: u32,
}

fn main() {
    let (q1, q2, q3, q4, q5) = (
        Query {
            id: Some(1),
            name: Some("tom".to_string()),
            offset: None,
            limit: Some(10),
        },
        Query {
            id: None,
            name: None,
            offset: None,
            limit: None,
        },
        Query {
            id: Some(1),
            name: None,
            offset: Some(1),
            limit: None,
        },
        Query {
            id: Some(1),
            name: None,
            offset: Some(1),
            limit: Some(1),
        },
        Query {
            id: Some(1),
            name: Some("tom".to_string()),
            offset: None,
            limit: None,
        },
    );
    assert_eq!(
        q1.to_sql_condition(),
        " WHERE id = 1 AND name = 'tom' LIMIT 10".to_string()
    );
    assert_eq!(q2.to_sql_condition(), "".to_string());
    assert_eq!(q3.to_sql_condition(), " WHERE id = 1 OFFSET 1".to_string());
    assert_eq!(
        q4.to_sql_condition(),
        " WHERE id = 1 OFFSET 1 LIMIT 1".to_string()
    );
    assert_eq!(
        q5.to_sql_condition(),
        " WHERE id = 1 AND name = 'tom'".to_string()
    );

    let q = QueryNoOption {
        id: 1,
        name: "tom".to_string(),
        offset: 1,
        limit: 1,
    };

    assert_eq!(
        q.to_sql_condition(),
        " WHERE id = 1 AND name = 'tom' OFFSET 1 LIMIT 1"
    );
}

依赖关系

~1.5MB
~35K SLoC