1 个不稳定版本
新 0.0.1-alpha | 2024年8月25日 |
---|
#102 in #syntax
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[])"
);
}