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
fn on_conflict_do_nothing(&self) -> OnConflictDoNothing<&Self>
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);
fn on_conflict<Target, Action>(
&self,
target: Target,
action: Action
) -> OnConflict<&Self, ConflictTarget<Target>, Action>
&self,
target: Target,
action: Action
) -> OnConflict<&Self, ConflictTarget<Target>, Action>
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:
- A column
- A tuple of columns
on_constraint("constraint_name")
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
impl<T: ?Sized> OnConflictExtension for T