sqlx icon indicating copy to clipboard operation
sqlx copied to clipboard

flatten for optionals

Open cemoktra opened this issue 6 months ago • 1 comments

Is your feature request related to a problem? Please describe. When selecting multiple columns from a left outer join (optional) i might get a set of 5 optional fields which i want to have in one optional struct that is none if nothing to join.

Describe the solution you'd like

#[derive(FromRow)]
struct DbRow {
  id_of_main_table: Uuid,
  otherstuff: (),
  #[sqlx(flatten)]
  inner: Option<Joined>
}

#[derive(FromRow)]
struct Joined {
  id_of_join: Uuid,
  more_joined_stuff: ()
}

Describe alternatives you've considered Alternatives are having all fields optional and writing a huge tuple match to convert into an optional struct or use a helper crate like tuple_combinator

The manual approach would like:

#[derive(FromRow)]
struct DbRow {
  id_of_main_table: Uuid,
  otherstuff: (),
  //
  id_of_join: Option<Uuid>,
  more_joined_stuff: Option<()>,
}

// some conversion like
let joined = if let (Some(id_of_join),  Some(more_joined_stuff)) = (id_of_join, more_joined_stuff) {
  Some(Joined {
    id_of_join,
    more_joined_stuff
  })
} else {
  None
};

cemoktra avatar Dec 13 '23 14:12 cemoktra

I've stumbled upon a series of Option in a query result type and wanted to refactor it into a single flattened Option<Inner> only to realize that this is not supported in sqlx, unlike in serde (playground).

But this should be easy, shouldn't it?

pravic avatar Apr 01 '24 21:04 pravic