Trait diesel::pg::upsert::OnConflictExtension [] [src]

pub trait OnConflictExtension {
    fn on_conflict_do_nothing(&self) -> OnConflictDoNothing<&Self> { ... }
fn on_conflict<Target, Action>(
        &self,
        target: Target,
        action: Action
    ) -> OnConflict<&Self, ConflictTarget<Target>, Action> { ... } }

Adds extension methods related to PG upsert

Provided Methods

Adds ON CONFLICT DO NOTHING to the insert statement, without specifying any columns or constraints to restrict the conflict to.

Examples

Single Record

use self::diesel::pg::upsert::*;

let user = User { id: 1, name: "Sean", };

let inserted_row_count = diesel::insert(&user.on_conflict_do_nothing())
    .into(users).execute(&conn);
assert_eq!(Ok(1), inserted_row_count);

let inserted_row_count = diesel::insert(&user.on_conflict_do_nothing())
    .into(users).execute(&conn);
assert_eq!(Ok(0), inserted_row_count);

Vec of Records

use self::diesel::pg::upsert::*;

let user = User { id: 1, name: "Sean", };

let inserted_row_count = diesel::insert(&vec![user, user].on_conflict_do_nothing())
    .into(users).execute(&conn);
assert_eq!(Ok(1), inserted_row_count);

Slice of records

use self::diesel::pg::upsert::*;

let user = User { id: 1, name: "Sean", };

let new_users: &[User] = &[user, user];
let inserted_row_count = diesel::insert(&new_users.on_conflict_do_nothing())
    .into(users).execute(&conn);
assert_eq!(Ok(1), inserted_row_count);

Adds an ON CONFLICT to the insert statement, performing the action specified by Action if a conflict occurs for Target.

Target can be one of:

Action can be one of:

Examples

Specifying a column as the target

use self::diesel::pg::upsert::*;

conn.execute("CREATE UNIQUE INDEX users_name ON users (name)").unwrap();
let user = User { id: 1, name: "Sean", };
let same_name_different_id = User { id: 2, name: "Sean" };
let same_id_different_name = User { id: 1, name: "Pascal" };

assert_eq!(Ok(1), diesel::insert(&user).into(users).execute(&conn));

let inserted_row_count = diesel::insert(
    &same_name_different_id.on_conflict(name, do_nothing())
).into(users).execute(&conn);
assert_eq!(Ok(0), inserted_row_count);

let pk_conflict_result = diesel::insert(
    &same_id_different_name.on_conflict(name, do_nothing())
).into(users).execute(&conn);
assert!(pk_conflict_result.is_err());

Specifying multiple columns as the target

use self::diesel::pg::upsert::*;

conn.execute("CREATE UNIQUE INDEX users_name_hair_color ON users (name, hair_color)").unwrap();
let user = User { id: 1, name: "Sean", hair_color: "black" };
let same_name_different_hair_color = User { id: 2, name: "Sean", hair_color: "brown" };
let same_same_name_same_hair_color = User { id: 3, name: "Sean", hair_color: "black" };

assert_eq!(Ok(1), diesel::insert(&user).into(users).execute(&conn));

let inserted_row_count = diesel::insert(
    &same_name_different_hair_color.on_conflict((name, hair_color), do_nothing())
).into(users).execute(&conn);
assert_eq!(Ok(1), inserted_row_count);

let inserted_row_count = diesel::insert(
    &same_same_name_same_hair_color.on_conflict((name, hair_color), do_nothing())
).into(users).execute(&conn);
assert_eq!(Ok(0), inserted_row_count);

See the documentation for on_constraint and [do_update] for more examples.

Implementors