Struct diesel::query_builder::InsertStatement [−][src]
pub struct InsertStatement<T, U, Op = Insert, Ret = NoReturningClause> { /* fields omitted */ }
Expand description
A fully constructed insert statement.
The parameters of this struct represent:
T
: The table we are inserting intoU
: The data being insertedOp
: The operation being performed. The specific types used to represent this are private, but correspond to SQL such asINSERT
orREPLACE
. You can safely rely on the default type representingINSERT
Ret
: TheRETURNING
clause of the query. The specific types used to represent this are private. You can safely rely on the default type representing a query without aRETURNING
clause.
Implementations
pub fn into_columns<C2>(
self,
columns: C2
) -> InsertStatement<T, InsertFromSelect<U, C2>, Op, Ret> where
C2: ColumnList<Table = T> + Expression<SqlType = U::SqlType>,
U: Query,
pub fn into_columns<C2>(
self,
columns: C2
) -> InsertStatement<T, InsertFromSelect<U, C2>, Op, Ret> where
C2: ColumnList<Table = T> + Expression<SqlType = U::SqlType>,
U: Query,
Set the column list when inserting from a select statement
See the documentation for insert_into
for usage examples.
pub fn returning<E>(
self,
returns: E
) -> InsertStatement<T, U, Op, ReturningClause<E>> where
InsertStatement<T, U, Op, ReturningClause<E>>: Query,
pub fn returning<E>(
self,
returns: E
) -> InsertStatement<T, U, Op, ReturningClause<E>> where
InsertStatement<T, U, Op, ReturningClause<E>>: Query,
Specify what expression is returned after execution of the insert
.
Examples
Inserting records:
let inserted_names = diesel::insert_into(users) .values(&vec![name.eq("Timmy"), name.eq("Jimmy")]) .returning(name) .get_results(&connection); assert_eq!(Ok(vec!["Timmy".to_string(), "Jimmy".to_string()]), inserted_names);
pub fn on_conflict_do_nothing(
self
) -> InsertStatement<T, OnConflictValues<U, NoConflictTarget, DoNothing>, Op, Ret>
pub fn on_conflict_do_nothing(
self
) -> InsertStatement<T, OnConflictValues<U, NoConflictTarget, DoNothing>, Op, Ret>
Adds ON CONFLICT DO NOTHING
to the insert statement, without
specifying any columns or constraints to restrict the conflict to.
Examples
Single Record
let user = User { id: 1, name: "Sean", }; let inserted_row_count = diesel::insert_into(users) .values(&user) .on_conflict_do_nothing() .execute(&conn); assert_eq!(Ok(1), inserted_row_count); let inserted_row_count = diesel::insert_into(users) .values(&user) .on_conflict_do_nothing() .execute(&conn); assert_eq!(Ok(0), inserted_row_count);
Vec of Records
let user = User { id: 1, name: "Sean", }; let inserted_row_count = diesel::insert_into(users) .values(&vec![user, user]) .on_conflict_do_nothing() .execute(&conn); assert_eq!(Ok(1), inserted_row_count);
pub fn on_conflict<Target>(
self,
target: Target
) -> IncompleteOnConflict<Self, ConflictTarget<Target>> where
ConflictTarget<Target>: OnConflictTarget<T>,
pub fn on_conflict<Target>(
self,
target: Target
) -> IncompleteOnConflict<Self, ConflictTarget<Target>> where
ConflictTarget<Target>: OnConflictTarget<T>,
Adds an ON CONFLICT
to the insert statement, if a conflict occurs
for the given unique constraint.
Target
can be one of:
- A column
- A tuple of columns
on_constraint("constraint_name")
Examples
Specifying a column as the target
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_into(users).values(&user).execute(&conn)); let inserted_row_count = diesel::insert_into(users) .values(&same_name_different_id) .on_conflict(name) .do_nothing() .execute(&conn); assert_eq!(Ok(0), inserted_row_count); let pk_conflict_result = diesel::insert_into(users) .values(&same_id_different_name) .on_conflict(name) .do_nothing() .execute(&conn); assert!(pk_conflict_result.is_err());
Specifying multiple columns as the target
use 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_name_same_hair_color = User { id: 3, name: "Sean", hair_color: "black" }; assert_eq!(Ok(1), diesel::insert_into(users).values(&user).execute(&conn)); let inserted_row_count = diesel::insert_into(users) .values(&same_name_different_hair_color) .on_conflict((name, hair_color)) .do_nothing() .execute(&conn); assert_eq!(Ok(1), inserted_row_count); let inserted_row_count = diesel::insert_into(users) .values(&same_name_same_hair_color) .on_conflict((name, hair_color)) .do_nothing() .execute(&conn); assert_eq!(Ok(0), inserted_row_count);
See the documentation for on_constraint
and do_update
for
more examples.
Trait Implementations
impl<T, U, Op> AsQuery for InsertStatement<T, U, Op, NoReturningClause> where
T: Table,
InsertStatement<T, U, Op, ReturningClause<T::AllColumns>>: Query,
impl<T, U, Op> AsQuery for InsertStatement<T, U, Op, NoReturningClause> where
T: Table,
InsertStatement<T, U, Op, ReturningClause<T::AllColumns>>: Query,
type Query = InsertStatement<T, U, Op, ReturningClause<T::AllColumns>>
type Query = InsertStatement<T, U, Op, ReturningClause<T::AllColumns>>
What kind of query does this type represent?
impl<'a, T, U, Op> ExecuteDsl<SqliteConnection, <SqliteConnection as Connection>::Backend> for InsertStatement<T, &'a [U], Op> where
&'a U: Insertable<T>,
InsertStatement<T, <&'a U as Insertable<T>>::Values, Op>: QueryFragment<Sqlite>,
T: Copy,
Op: Copy,
impl<'a, T, U, Op> ExecuteDsl<SqliteConnection, <SqliteConnection as Connection>::Backend> for InsertStatement<T, &'a [U], Op> where
&'a U: Insertable<T>,
InsertStatement<T, <&'a U as Insertable<T>>::Values, Op>: QueryFragment<Sqlite>,
T: Copy,
Op: Copy,
Execute this command
impl<'a, T, U, Op> ExecuteDsl<SqliteConnection, <SqliteConnection as Connection>::Backend> for InsertStatement<T, BatchInsert<'a, U, T>, Op> where
InsertStatement<T, &'a [U], Op>: ExecuteDsl<SqliteConnection>,
impl<'a, T, U, Op> ExecuteDsl<SqliteConnection, <SqliteConnection as Connection>::Backend> for InsertStatement<T, BatchInsert<'a, U, T>, Op> where
InsertStatement<T, &'a [U], Op>: ExecuteDsl<SqliteConnection>,
Execute this command
impl<T, U, Op, Ret> Query for InsertStatement<T, U, Op, ReturningClause<Ret>> where
Ret: Expression + SelectableExpression<T> + NonAggregate,
impl<T, U, Op, Ret> Query for InsertStatement<T, U, Op, ReturningClause<Ret>> where
Ret: Expression + SelectableExpression<T> + NonAggregate,
impl<T, U, Op, Ret, DB> QueryFragment<DB> for InsertStatement<T, U, Op, Ret> where
DB: Backend,
T: Table,
T::FromClause: QueryFragment<DB>,
U: QueryFragment<DB> + CanInsertInSingleQuery<DB>,
Op: QueryFragment<DB>,
Ret: QueryFragment<DB>,
impl<T, U, Op, Ret, DB> QueryFragment<DB> for InsertStatement<T, U, Op, Ret> where
DB: Backend,
T: Table,
T::FromClause: QueryFragment<DB>,
U: QueryFragment<DB> + CanInsertInSingleQuery<DB>,
Op: QueryFragment<DB>,
Ret: QueryFragment<DB>,
Walk over this QueryFragment
for all passes. Read more
Converts this QueryFragment
to its SQL representation. Read more
fn collect_binds(
&self,
out: &mut DB::BindCollector,
metadata_lookup: &DB::MetadataLookup
) -> QueryResult<()>
fn collect_binds(
&self,
out: &mut DB::BindCollector,
metadata_lookup: &DB::MetadataLookup
) -> QueryResult<()>
Serializes all bind parameters in this query. Read more
Is this query safe to store in the prepared statement cache? Read more
Can the SQL generated by Self
be uniquely identified by its type? Read more
fn execute(self, conn: &Conn) -> QueryResult<usize> where
Conn: Connection,
Self: ExecuteDsl<Conn>,
fn execute(self, conn: &Conn) -> QueryResult<usize> where
Conn: Connection,
Self: ExecuteDsl<Conn>,
Executes the given command, returning the number of rows affected. Read more
Executes the given query, returning a Vec
with the returned rows. Read more
Runs the command, and returns the affected row. Read more
Runs the command, returning an Vec
with the affected rows. Read more
Auto Trait Implementations
impl<T, U, Op, Ret> RefUnwindSafe for InsertStatement<T, U, Op, Ret> where
Op: RefUnwindSafe,
Ret: RefUnwindSafe,
T: RefUnwindSafe,
U: RefUnwindSafe,
impl<T, U, Op, Ret> Send for InsertStatement<T, U, Op, Ret> where
Op: Send,
Ret: Send,
T: Send,
U: Send,
impl<T, U, Op, Ret> Sync for InsertStatement<T, U, Op, Ret> where
Op: Sync,
Ret: Sync,
T: Sync,
U: Sync,
impl<T, U, Op, Ret> Unpin for InsertStatement<T, U, Op, Ret> where
Op: Unpin,
Ret: Unpin,
T: Unpin,
U: Unpin,
impl<T, U, Op, Ret> UnwindSafe for InsertStatement<T, U, Op, Ret> where
Op: UnwindSafe,
Ret: UnwindSafe,
T: UnwindSafe,
U: UnwindSafe,
Blanket Implementations
type Query = T
type Query = T
What kind of query does this type represent?
Mutably borrows from an owned value. Read more
impl<Conn, DB, T> ExecuteDsl<Conn, DB> for T where
DB: Backend,
T: QueryFragment<DB> + QueryId,
Conn: Connection<Backend = DB>,
impl<Conn, DB, T> ExecuteDsl<Conn, DB> for T where
DB: Backend,
T: QueryFragment<DB> + QueryId,
Conn: Connection<Backend = DB>,
Convert self
to an expression for Diesel’s query builder. Read more