this post was submitted on 24 Sep 2023
8 points (100.0% liked)

Rust

6005 readers
4 users here now

Welcome to the Rust community! This is a place to discuss about the Rust programming language.

Wormhole

!performance@programming.dev

Credits

  • The icon is a modified version of the official rust logo (changing the colors to a gradient and black background)

founded 1 year ago
MODERATORS
 

in sequelize (javascript) it's pretty straightforward to either find a record, or create it if it doesn't exist. I don't see anything similar with sea-orm. There's a 'save' method that seems to insert or update, but I need to know details about the record ahead of time :/

Any ideas?

https://sequelize.org/docs/v6/core-concepts/model-querying-finders/

you are viewing a single comment's thread
view the rest of the comments
[–] nerdblood@programming.dev 1 points 1 year ago (10 children)

I managed to get this working, but there has to be a better way. How else could I write this?

  pub async fn insert_or_return_user(
        db: &DbConn,
        partial_user: Auth0UserPart,
    ) -> Result {
        let user = users::ActiveModel {
            email: Set(partial_user.email.to_owned()),
            email_verified: Set(partial_user.email_verified.to_owned()),
            auth0_sub: Set(partial_user.sub.to_owned()),
            ..Default::default()
        };

        let result = user.clone().insert(db).await;

        match result {
            Ok(u) => {
                println!("{u:#?}");
                Ok(u.try_into_model().unwrap() as UsersModel)
            }
            Err(error) => {
                let user = Users::find()
                    .filter(users::Column::Auth0Sub.eq(&partial_user.sub))
                    .one(db)
                    .await?;

                Ok(user.unwrap() as UsersModel)
            }
        }
    }
[–] snaggen@programming.dev 3 points 1 year ago (2 children)

I have never used sea-orm, but I wonder if .on_conflict could be used to simplify the code above?

[–] BitSound@lemmy.world 3 points 1 year ago

This is likely what OP will have to do. It actually looks like ANSI SQL now has merge, but you can scroll down a bit and see how each DB handles it slightly differently if you don't use merge.

[–] nerdblood@programming.dev 1 points 1 year ago

I think I had that in a few attempts, I can't remember why I removed it. Thanks for pointing this out.

load more comments (7 replies)