6个版本
0.0.6 | 2024年1月24日 |
---|---|
0.0.5 | 2024年1月24日 |
0.0.4 | 2023年12月31日 |
#2390 在 数据库接口
49 每月下载量
78KB
873 行
squeal
Rust查询构建器。
创建一个代表SQL查询的(安全、正确)Rust结构,然后将其渲染成SQL本身。
在适当的位置设计了逃生口。
目标SQL方言是PostgreSQL。Postgres库是 https://docs.rs/postgres/latest/postgres/
Go的类似库是 https://github.com/leporo/sqlf。
准备就绪
此代码尚未准备就绪。
针对Rust 1.75.x构建。
许可
许可:LGPL 3.0或更新。
lib.rs
:
简单的Rust查询构建器
提供了一种简单直接的方式在Rust中构建SQL查询。从概念上讲,你在一个"Query"对象中构建一个正确命名的对象列表,然后调用Query对象的sql()方法来获取SQL字符串。
内置逃生口,允许您使用任何SQL并将其正确集成。
设计目标之一是不使用属性、宏或其他“魔法”来使它工作。
"简单且愚蠢"。
示例
use squeal::*;
let result = Query {
select: Some(Select::new(Columns::Star)),
from: Some("table"),
where_clause: Some(Term::Condition(
Box::new(Term::Atom("a")),
Op::O("<>"),
Box::new(Term::Atom("b")))),
group_by: None,
having: None,
order_by: None,
limit: None,
offset: None,
for_update: false,
}.sql();
assert_eq!(result, "SELECT * FROM table WHERE a <> b");
注意Enum作用域的冗长。这不是故意的,而是这个还在早期开发阶段的一个特性。
使用Q()流畅接口的示例
use squeal::*;
let mut qb = Q();
let result = qb.select(vec!["a", "sum(b)"])
.from("the_table")
.where_(Term::Condition(
Box::new(Term::Atom("a")),
Op::O(">"),
Box::new(Term::Atom("10"))))
.group_by(vec!["b"])
.having(Term::Condition(
Box::new(Term::Atom("a")),
Op::O(">"),
Box::new(Term::Atom("1000"))))
.limit(19)
.offset(10);
let q = result.build();
assert_eq!(q.sql(), "SELECT a, sum(b) FROM the_table WHERE a > 10 GROUP BY b HAVING a > 1000 LIMIT 19 OFFSET 10");
依赖关系
~7–16MB
~232K SLoC