如何使用柴油进行 IN 查询?
Posted
技术标签:
【中文标题】如何使用柴油进行 IN 查询?【英文标题】:How to do a IN query using diesel? 【发布时间】:2021-11-07 09:36:51 【问题描述】:我想使用 PostgreSQL 13 对 diesel 进行 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
我阅读了docs 和source code demo,但它太短了,并没有提到如何在集合中按 id 执行查询。我应该怎么做才能在锈柴油(diesel = version = "1.4.4", features = ["postgres"]
)中进行 IN 查询?这是一个最小可重复的demo。
【问题讨论】:
【参考方案1】:您正在寻找.eq_any()
。但请注意文档:
创建一个 SQL
IN
语句。使用此方法的查询不会被放入准备好的语句缓存中。 在 PostgreSQL 上,您应该改用
eq(any())
。 此方法将来可能会更改为在 PostgreSQL 上自动执行= ANY
。
因此,使用 .eq()
和 any()
您的代码应该如下所示:
let results = songs.filter(id.eq(any(ids)))
.load::<QuerySongs>(&connection)
.expect("Error loading posts");
【讨论】:
你节省了我的时间兄弟,我搜索了好几天。谢谢。@kmdreko以上是关于如何使用柴油进行 IN 查询?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rust Diesel 中使用时间戳和间隔进行算术运算