6

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?

Blake Pettersson
  • 8,927
  • 3
  • 27
  • 36

1 Answers1

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)
Simson
  • 3,373
  • 2
  • 24
  • 38
John T
  • 203
  • 2
  • 8
  • 1
    How would one address the "dynamically selecting fields" part of the original question? Does dynamic field selection require working with a lower-level view of the returned data? – ehdv Dec 08 '21 at 14:38