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 查询?这是一个最小的可复制演示。
您正在寻找.eq_any():
创建 SQL
IN语句。
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 上自动执行。
那里有一点自我实现的预言。
| 归档时间: |
|
| 查看次数: |
2827 次 |
| 最近记录: |