在玩 Diesel 时,我一直在编写一个函数,该函数将String
s 的向量作为输入并执行以下操作:
- 将所有
String
s 组合成一个大查询 - 在
Connection
- 处理结果
- 返回一个
Vec
如果我一步构建查询,它就可以正常工作:
fn get_books(authors: Vec<String>, connection: SqliteConnection) {
use schema::ebook::dsl::*;
let inner = author
.like(format!("%{}%", authors[0]))
.and(author.like(format!("%{}%", authors[1])))
.and(author.like(format!("%{}%", authors[2])));
ebook
.filter(inner)
.load::<Ebook>(&connection)
.expect("Error loading ebook");
}
如果我尝试以更多步骤生成查询(需要使用输入向量的可变长度),我无法编译它:
fn get_books(authors: Vec<String>, connection: SqliteConnection) {
use schema::ebook::dsl::*;
let mut inner = author
.like(format!("%{}%", authors[0]))
.and(author.like(format!("%{}%", authors[1]))); // <1>
inner = inner.and(author.like(format!("%{}%", authors[2]))); // <2>
ebook
.filter(inner)
.load::<Ebook>(&connection)
.expect("Error loading ebook");
}
这会产生以下错误:
inner = inner.and(author.like(format!("%{}%",authors[2])));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `diesel::expression::operators::Like`, found struct `diesel::expression::operators::And`
我不明白为什么 Rust 需要 aLike
而不是And
. 函数 an 行 line 标记<1>
返回 an And
,因此 anAnd
存储在inner
.
我错过了什么?为什么第一个代码可以编译而第二个不会?生成这种查询的正确方法是什么?