3个不稳定版本

0.2.0 2021年11月8日
0.1.1 2021年11月4日
0.1.0 2021年11月4日

#76 in #query-builder


typed-qb中使用

MPL-2.0 许可证

70KB
2K SLoC

crates.io docs

typed-qb: 一个编译时类型化“查询构建器”

typed-qb是一个编译时类型化查询构建器。这个库的目标是探索原始SQL查询(如sqlx)的编译时验证和通过查询构建器(如diesel)在运行时生成查询之间的差距。

查询在编译时转换为SQL查询字符串。如果代码编译且代码中的模式与数据库中的模式匹配,则几乎不可能编写出产生错误的查询。

用法

您可以通过将SHOW CREATE TABLE ..的输出粘贴到tables!宏中来指定您的表结构。您需要清理反引号(`),因为Rust无法解析它们。例如

tables! {
    CREATE TABLE Users (
        Id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        Name VARCHAR(64) NOT NULL,
        PRIMARY KEY(Id)
    );
}

如果将字段名写成camelCasePascalCase,它们将自动转换为snake_case。然后您可以按照以下方式查询表

let conn = ...; // some connection

let all_users = conn.typed_query(
    Users::query(|user| data! {
        id: user.id,
        name: user.name,
    })
)?;

for user in all_users {
    let user = user?;
    println!("{} ({})", user.id, user.name);
}

查询在编译时转换为

SELECT `t0`.`Id` AS `id`, `t0`.`Name` AS `name` 
FROM `Users` AS t0

您可以使用select函数指定WHEREORDER BY等子句

Users::query(|user| select(data! {
    id: user.id,
    name: user.name,
}, |selected| {
    expr!(selected.id < 5)
        .order_by(selected.name.asc()
            .then_by(selected.id.desc())
        )
        .limit::<3>()
}))

typed_query返回的类型取决于查询本身。上述两个查询返回一个匿名struct的迭代器。如果选择单个值,例如

let user_count = conn.typed_query(Users::query(|_| expr!(COUNT(*))))?;

user_count的类型将是u64

请参阅更多示例

(不稳定)

此项目需要Rust nightly版本,并使用了许多特性,其中一些尚未完成。您可能会遇到ICEs。对typed-qb本身的破坏性更改可能很多。您可能不应该将typed-qb用于严重项目。

许可证

typed-qb 使用 Mozilla 公共许可证 2.0 (MPL2.0)。请参阅 LICENSE 文件。

依赖项

~1.5MB
~35K SLoC