首页 > 解决方案 > 如何使用柴油进行 IN 查询?

问题描述

我想使用 PostgreSQL 13 对柴油IN进行查询,以从某些 id 集合中的歌曲表中选择歌曲集合。数据库执行的 SQL 可能如下所示:

select * from songs where id in(1,2,3)

我试图用这样的生锈柴油方式做的事情:

pub fn songs(ids: Vec<i64>){
    use schema::songs::dsl::*;
    let connection = config::establish_connection();
    let results = songs.filter(id.contains(ids))
        .load::<QuerySongs>(&connection)
        .expect("Error loading posts");
}

似乎没有用,当我使用cargo build显示如下错误编译项目代码时:

error[E0599]: the method `contains` exists for struct `songs::schema::songs::columns::id`, but its trait bounds were not satisfied
  --> src/biz/music/songs.rs:37:35
   |
37 |       let results = songs.filter(id.contains(ids))
   |                                     ^^^^^^^^ method cannot be called on `songs::schema::songs::columns::id` due to unsatisfied trait bounds

我阅读了文档源代码演示,但它很短,并没有提到如何通过集合中的 id 执行查询。我应该怎么做才能在 rustdies( diesel = { version = "1.4.4", features = ["postgres"] }) 中进行 IN 查询?这是一个最小的可重现演示

标签: postgresqlrustrust-diesel

解决方案


你正在寻找.eq_any(). 但请注意文档:

创建一条 SQLIN语句。

使用此方法的查询不会被放置在准备好的语句缓存中。在 PostgreSQL 上,您应该eq(any())改用。此方法将来可能会更改为= ANY在 PostgreSQL 上自动执行。

所以使用.eq()any()你的代码应该看起来像:

let results = songs.filter(id.eq(any(ids)))
    .load::<QuerySongs>(&connection)
    .expect("Error loading posts");

推荐阅读