Rust 柴油有条件过滤查询

2024-06-18

我正在尝试在一个项目中使用柴油,并且我想要一个“可过滤”类型。这个想法是你可以去/api/foo?id=10&bar=11它会返回一个结构体Foo:

struct Foo {
    id: Option<i64>,
    bar: Option<i64>,
    name: Option<String>,
}

Such as:

Foo {
   id: Some(10),
   bar: Some(11),
   name: None,
}

我一直在互联网上搜索一种按现有字段进行过滤的方法,但我无法找到有效的解决方案。我最初使用的是mysql驱动程序 https://crates.io/crates/mysql并使用 proc 宏构建 sql 查询,但是diesel 更好用,我想知道是否有一种方法可以获得与diesel 的 mysql 驱动程序相同的行为。


您可以使用into_boxed https://docs.diesel.rs/diesel/query_dsl/trait.QueryDsl.html#method.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");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 柴油有条件过滤查询 的相关文章

随机推荐