问题
I was starting to look into using Diesel for querying a database. I have a table that looks something like the struct below (this is just a toy project to help me understand how Diesel works).
#[derive(Queryable, Insertable)]
#[table_name="posts"]
struct Post {
id: String,
title: String,
body: String,
published: bool
}
Doing queries that are fully determined at compile time is easy enough, for example
posts.select(id, title).order(title.desc());
What is not clear to me is how to build a query depending on some runtime parameters, without having to fall back to SQL. For example JSONAPI allows for dynamically selecting fields and sorting them based on query parameters. How would I do this in Diesel?
回答1:
Using a boxed trait:
let mut q = dsl::constants.into_boxed();
if let Some(sid) = msg.0 {
q = q.filter(dsl::id.eq(sid));
}
let items = q
.order(dsl::id)
.load::<Constant>(conn)
.expect("Can't load Constant");
Ok(items)
来源:https://stackoverflow.com/questions/42557528/querying-a-diesel-table-with-dynamic-parameters