【问题标题】:Rust diesel conditionally filter a queryRust 柴油有条件地过滤查询
【发布时间】:2021-03-10 09:05:53
【问题描述】:

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

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

如:

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

我一直在互联网上寻找一种按现有字段进行过滤的方法,但我找不到有效的解决方案。我最初使用 mysql driver 并使用 proc 宏构造 sql 查询,但是使用柴油机要好得多,我想知道是否有办法获得与使用柴油机的 mysql 驱动程序相同的行为。

【问题讨论】:

  • 更新:我用派生宏做了一个板条箱来处理这个问题,crates.io/crates/into_query
  • 您是否使用餐桌方式工作? @最低点

标签: rust backend rust-diesel


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 2021-03-17
  • 2022-01-03
  • 2021-12-31
  • 2021-07-25
  • 2021-05-10
  • 2021-09-26
  • 2021-11-07
  • 2020-08-29
  • 2019-01-08
相关资源
最近更新 更多