6个版本

0.0.6 2024年1月24日
0.0.5 2024年1月24日
0.0.4 2023年12月31日

#2390数据库接口

49 每月下载量

LGPL-3.0或更新

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