rust - Rust 柴油有条件地过滤查询
问题描述
我正在尝试将柴油用于一个项目,并且我想要一种“可过滤”类型。这个想法是你可以去/api/foo?id=10&bar=11
,它会返回一个 struct Foo
:
struct Foo {
id: Option<i64>,
bar: Option<i64>,
name: Option<String>,
}
如:
Foo {
id: Some(10),
bar: Some(11),
name: None,
}
我一直在互联网上寻找一种按现有字段进行过滤的方法,但我找不到有效的解决方案。我最初使用mysql 驱动程序并使用 proc 宏构造 sql 查询,但是使用柴油机要好得多,我想知道是否有办法获得与使用柴油机的 mysql 驱动程序相同的行为。
解决方案
您可以使用以下into_boxed
方法:
将查询的各个部分装箱成单一类型。这对于您想要有条件地修改查询但需要类型保持不变的情况很有用。盒装查询将导致轻微的性能损失,因为编译器无法再内联查询构建器。对于大多数应用程序,此成本将是最低的。
use crate::schema::foo;
let mut query = foo::table.into_boxed();
if let Some(id) = foo.id {
query = query.filter(foo::id.eq(id));
}
if let Some(bar) = foo.bar {
query = query.filter(foo::bar.eq(bar));
}
if let Some(name) = foo.name {
query = query.filter(foo::name.eq(name));
}
let results = query
.load::<Foo>(&conn)
.expect("error loading foo");
推荐阅读
- computer-vision - 我在自定义视觉中创建了一个新模型。我如何在计算机视觉中使用这个模型?
- javascript - 如何避免由于 NaN 或具有 rowcallback toExponential(2) 的列中的其他非数值导致的错误
- javascript - 如何使用 jquery 添加闪烁效果以完成表格行?
- google-cloud-platform - 跟踪截止日期以发送提醒的设计模式
- node.js - NodeJS:在上传到 S3 之前如何压缩流?
- virtual-machine - 检测远程桌面连接窗口的最小化
- java - 无法使用 recyclerview 上的改造显示来自 API 的数据
- r - 如何在 Rmarkdown 中“装箱”“summary()”的输出
- c - 不使用 print 语句给出输出
- python - Selenium Python 在 VPS 中设置 Chrome 默认下载目录