#sql-query #syntax #value #string #var-to-sql

sqler

此包提供了一种使用 Rust 语法编写 SQL 查询的方法

1 个不稳定版本

0.0.1-alpha2024年8月25日

#102 in #syntax

MIT/Apache

10KB
211 行代码(不含注释)

sqler - alpha

一个过程宏,帮助使用 Rust 语法编写 SQL 查询

用法

首先,在你的 Cargo.toml 文件中添加以下内容

[dependencies]
sqler = "0.0.1-alpha"

示例 1

要仅嵌入变量的值,你可以这样做

use sqler::sql;

fn main() {
    let first_name = String::from("Ali");
    let age = 24;
    let query = sql!(
        SELECT * FROM users
        WHERE first_name = {first_name}
        OR age = {age}
    );

    assert_eq!(
        query,
        "SELECT * FROM users WHERE first_name = 'Ali' OR age = 24"
    );
}

此宏将处理嵌入任何变量值的过程(仅限于内置类型),并将 Rust 语法转换为包含 SQL 语句的字符串。

示例 2 你也可以直接写入值

use sqler::sql;

fn main() {
    let query = sql!(
        SELECT * FROM users
        WHERE first_name = "Ali"
        OR age = 24
    );

    assert_eq!(
        query,
        "SELECT * FROM users WHERE first_name = 'Ali' OR age = 24"
    );
}

示例 3 你还可以使用十六进制、八进制或二进制数字格式,宏将将其转换为十进制。

use sqler::sql;

fn main() {
    let query = sql!(
        UPDATE employees 
        SET 
            age=0x1f,
            salery=0o5776
        WHERE
            emp_id=0b101
    );

    assert_eq!(
        query,
        "UPDATE employees SET age = 31, salery = 3070 WHERE emp_id = 5"
    );
}

示例 4 关于你的自定义类型?你可以通过实现 "VarToSql" 特性来嵌入自定义类型,如下所示

use sqler::{sql, VarToSql};

struct IntArr(Vec<i32>);

impl VarToSql for IntArr {
    fn sql(&self) -> String {
        let mut sql = String::from("ARRAY[");

        for i in 0..self.0.len() - 1 {
            sql.push_str(&self.0[i].to_string());
            sql.push_str(", ");
        }

        sql.push_str(&self.0[self.0.len() - 1].to_string());
        sql.push_str("]::INT[]");
        sql
    }
}

fn main() {
    let permissions = IntArr(vec![1, 2, 3]);
    let query = sql!(
        INSERT INTO user_permissions
            (user_id, permissions)
        VALUES
            (1, {permissions})
    );

    assert_eq!(
        query,
        "INSERT INTO user_permissions (user_id, permissions) VALUES (1, ARRAY[1, 2, 3]::INT[])"
    );
}

依赖项