首页 > 解决方案 > 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 驱动程序相同的行为。

标签: rustbackendrust-diesel

解决方案


您可以使用以下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");

推荐阅读