Search code examples
rustrust-diesel

Is it possible to execute upsert in a custom constraint when using diesel


I am using this rust code to do an upsert right now:

diesel::insert_into(favorites::table)
        .values(&new_fav)
        .on_conflict(id)
        .do_update()
        .set(like_status.eq(1))
        .execute(&connection)
        .unwrap();

but the execute log shows error:

thread 'rocket-worker-thread' panicked at 'called `Result::unwrap()` on an `Err` value: DatabaseError(UniqueViolation, "duplicate key value violates unique constraint \"fav_uniq_idx\"")', src/service/music/music_service.rs:49:10

fav_uniq_idx is a custom uniq constraint in PostgreSQL 13, define it like this:

ALTER TABLE public.favorites ADD CONSTRAINT unique_idx UNIQUE (source_id, user_id);

is it possible to define the conflict handle logic in rust diesel code about custom constraint?


Solution

  • I do it like this:

    diesel::insert_into(favorites::table)
            .values(&new_fav)
            .on_conflict(on_constraint("unique_idx"))
            .do_update()
            .set(like_status.eq(1))
            .execute(&connection)
            .unwrap();
    

    works.