Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Querying a Diesel table with dynamic parameters

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?

like image 716
Blake Pettersson Avatar asked Mar 02 '17 14:03

Blake Pettersson


1 Answers

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)
like image 183
John T Avatar answered Oct 21 '22 03:10

John T