如何使用diesel进行IN查询?

Dol*_*hin 5 postgresql rust rust-diesel

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

select * from songs where id in(1,2,3)
Run Code Online (Sandbox Code Playgroud)

我尝试使用像这样的铁锈柴油方式做的事情:

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");
}
Run Code Online (Sandbox Code Playgroud)

似乎不起作用,当我使用cargo build显示错误编译项目代码时,如下所示:

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");
}
Run Code Online (Sandbox Code Playgroud)

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

kmd*_*eko 9

您正在寻找.eq_any()

创建 SQLIN语句。

let results = songs.filter(id.eq_any(ids))
    .load::<QuerySongs>(&connection)
    .expect("Error loading posts");
Run Code Online (Sandbox Code Playgroud)

如果将 Diesel 2.x 与 PostgreSQL 一起使用,这将自动转换为= ANY()查询(文档):

使用此方法的查询通常不会放置在准备好的语句缓存中。但是,在将子查询传递给该方法时,该查询将使用缓存(假设子查询本身可以安全地缓存)。在 PostgreSQL 上,此方法自动执行= ANY()查询。

如果将 Diesel 1.x 与 PostgreSQL 一起使用,则应该使用eq(any(...))( docs )。

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

那里有一点自我实现的预言。