Skip to content

flatten for optionals #2934

Open
Open
@cemoktra

Description

@cemoktra
Contributor

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
};

Activity

pravic

pravic commented on Apr 1, 2024

@pravic

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?

added a commit that references this issue on Jan 5, 2025

enhancement: (launchbadge#2934) implement FromRow for Option<T> where…

added a commit that references this issue on Jan 8, 2025

launchbadge#2934 solution using autoref trick instead of blanket impl…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Participants

      @pravic@cemoktra

      Issue actions

        flatten for optionals · Issue #2934 · launchbadge/sqlx