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中使用
70KB
2K SLoC
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)
);
}
如果将字段名写成camelCase
或PascalCase
,它们将自动转换为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
函数指定WHERE
、ORDER 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