pub struct UpdateStatement<T: QuerySource, U, V = SetNotCalled, Ret = NoReturningClause> { /* private fields */ }Expand description
Represents a complete UPDATE statement.
See update for usage examples, or the update
guide for a more exhaustive
set of examples.
Implementations§
Source§impl<T: QuerySource, U> UpdateStatement<T, U, SetNotCalled>
impl<T: QuerySource, U> UpdateStatement<T, U, SetNotCalled>
Sourcepub fn set<V>(self, values: V) -> Set<Self, V>
pub fn set<V>(self, values: V) -> Set<Self, V>
Provides the SET clause of the UPDATE statement.
See update for usage examples, or the update
guide for a more exhaustive
set of examples.
Source§impl<T: QuerySource, U, V, Ret> UpdateStatement<T, U, V, Ret>
impl<T: QuerySource, U, V, Ret> UpdateStatement<T, U, V, Ret>
Sourcepub fn filter<Predicate>(self, predicate: Predicate) -> Filter<Self, Predicate>where
Self: FilterDsl<Predicate>,
pub fn filter<Predicate>(self, predicate: Predicate) -> Filter<Self, Predicate>where
Self: FilterDsl<Predicate>,
Adds the given predicate to the WHERE clause of the statement being
constructed.
If there is already a WHERE clause, the predicate will be appended
with AND. There is no difference in behavior between
update(table.filter(x)) and update(table).filter(x).
§Example
let updated_rows = diesel::update(users)
.set(name.eq("Jim"))
.filter(name.eq("Sean"))
.execute(connection);
assert_eq!(Ok(1), updated_rows);
let expected_names = vec!["Jim".to_string(), "Tess".to_string()];
let names = users.select(name).order(id).load(connection);
assert_eq!(Ok(expected_names), names);Sourcepub fn into_boxed<'a, DB>(self) -> IntoBoxed<'a, Self, DB>
pub fn into_boxed<'a, DB>(self) -> IntoBoxed<'a, Self, DB>
Boxes the WHERE clause of this update statement.
This is useful for cases where you want to conditionally modify a query, but need the type to remain the same. The backend must be specified as part of this. It is not possible to box a query and have it be useable on multiple backends.
A boxed query will incur a minor performance penalty, as the query builder can no longer be inlined by the compiler. For most applications this cost will be minimal.
§Example
let mut query = diesel::update(users).set(name.eq("Jerk")).into_boxed();
if !params["tess_has_been_a_jerk"] {
query = query.filter(name.ne("Tess"));
}
let updated_rows = query.execute(connection)?;
assert_eq!(1, updated_rows);
let expected_names = vec!["Jerk", "Tess"];
let names = users.select(name).order(id).load::<String>(connection)?;
assert_eq!(expected_names, names);Sourcepub fn into_boxed_clone<'a, DB>(self) -> IntoBoxedClone<'a, Self, DB>where
DB: Backend,
Self: BoxedCloneDsl<'a, DB>,
pub fn into_boxed_clone<'a, DB>(self) -> IntoBoxedClone<'a, Self, DB>where
DB: Backend,
Self: BoxedCloneDsl<'a, DB>,
Wraps the WHERE clause of this update statement in an Arc.
This is useful for cases where you want to clone and conditionally modify a query, but need the type to remain the same. The backend must be specified as part of this. It is not possible to box a query and have it be useable on multiple backends.
A cloneable boxed query will incur a slightly greater performance penalty than a standard boxed query. In both cases, the query builder can no longer be inlined by the compiler. For most applications this cost will be minimal.
§Example
let query = diesel::update(users).set(name.eq("Jerk")).into_boxed_clone();
let mut query = query.clone();
if !params["tess_has_been_a_jerk"] {
query = query.filter(name.ne("Tess"));
}
let updated_rows = query.execute(connection)?;
assert_eq!(1, updated_rows);
let expected_names = vec!["Jerk", "Tess"];
let names = users.select(name).order(id).load::<String>(connection)?;
assert_eq!(expected_names, names);Source§impl<T: QuerySource, U, V> UpdateStatement<T, U, V, NoReturningClause>
impl<T: QuerySource, U, V> UpdateStatement<T, U, V, NoReturningClause>
Sourcepub fn returning<E>(
self,
returns: E,
) -> UpdateStatement<T, U, V, ReturningClause<E>>
pub fn returning<E>( self, returns: E, ) -> UpdateStatement<T, U, V, ReturningClause<E>>
Specify what expression is returned after execution of the update.
On MariaDB, rows that match the filter but whose values do not change
are left out of the result, so get_result returns NotFound where
execute reports one updated row
(MDEV-41113).
§Examples
§Updating a single record:
let updated_name = diesel::update(users.filter(id.eq(1)))
.set(name.eq("Dean"))
.returning(name)
.get_result(connection);
assert_eq!(Ok("Dean".to_string()), updated_name);§Returning the pre-update value (PostgreSQL 18+):
RETURNING old.col — exposed via diesel::pg::returning::old() —
returns the value of the column before the update was applied.
This requires PostgreSQL 18 or newer.
let was_and_now = diesel::update(users.filter(id.eq(1)))
.set(name.eq("Dean"))
.returning((old(name), name))
.get_result::<(String, String)>(connection);
assert_eq!(Ok(("Sean".to_string(), "Dean".to_string())), was_and_now);Trait Implementations§
Source§impl<T, U, V> AsQuery for UpdateStatement<T, U, V, NoReturningClause>where
T: Table,
UpdateStatement<T, U, V, ReturningClause<T::AllColumns>>: Query,
T::AllColumns: SelectableExpression<ReturningQuerySource<UpdateStmt, T>> + ValidGrouping<()>,
<T::AllColumns as ValidGrouping<()>>::IsAggregate: MixedAggregates<No, Output = No>,
impl<T, U, V> AsQuery for UpdateStatement<T, U, V, NoReturningClause>where
T: Table,
UpdateStatement<T, U, V, ReturningClause<T::AllColumns>>: Query,
T::AllColumns: SelectableExpression<ReturningQuerySource<UpdateStmt, T>> + ValidGrouping<()>,
<T::AllColumns as ValidGrouping<()>>::IsAggregate: MixedAggregates<No, Output = No>,
Source§type SqlType = <<UpdateStatement<T, U, V> as AsQuery>::Query as Query>::SqlType
type SqlType = <<UpdateStatement<T, U, V> as AsQuery>::Query as Query>::SqlType
Self::QuerySource§type Query = UpdateStatement<T, U, V, ReturningClause<<T as Table>::AllColumns>>
type Query = UpdateStatement<T, U, V, ReturningClause<<T as Table>::AllColumns>>
Source§impl<'a, T, U, V, Ret, DB> BoxedCloneDsl<'a, DB> for UpdateStatement<T, U, V, Ret>where
T: QuerySource,
U: Into<BoxedCloneWhereClause<'a, DB>>,
impl<'a, T, U, V, Ret, DB> BoxedCloneDsl<'a, DB> for UpdateStatement<T, U, V, Ret>where
T: QuerySource,
U: Into<BoxedCloneWhereClause<'a, DB>>,
Source§type Output = UpdateStatement<T, BoxedCloneWhereClause<'a, DB>, V, Ret>
type Output = UpdateStatement<T, BoxedCloneWhereClause<'a, DB>, V, Ret>
internal_into_boxed_cloneSource§fn internal_into_boxed_clone(self) -> Self::Output
fn internal_into_boxed_clone(self) -> Self::Output
Source§impl<'a, T, U, V, Ret, DB> BoxedDsl<'a, DB> for UpdateStatement<T, U, V, Ret>where
T: QuerySource,
U: Into<BoxedWhereClause<'a, DB>>,
impl<'a, T, U, V, Ret, DB> BoxedDsl<'a, DB> for UpdateStatement<T, U, V, Ret>where
T: QuerySource,
U: Into<BoxedWhereClause<'a, DB>>,
Source§type Output = UpdateStatement<T, BoxedWhereClause<'a, DB>, V, Ret>
type Output = UpdateStatement<T, BoxedWhereClause<'a, DB>, V, Ret>
internal_into_boxedSource§fn internal_into_boxed(self) -> Self::Output
fn internal_into_boxed(self) -> Self::Output
Source§impl<T: Clone + QuerySource, U: Clone, V: Clone, Ret: Clone> Clone for UpdateStatement<T, U, V, Ret>where
T::FromClause: Clone,
impl<T: Clone + QuerySource, U: Clone, V: Clone, Ret: Clone> Clone for UpdateStatement<T, U, V, Ret>where
T::FromClause: Clone,
Source§impl<T: Debug + QuerySource, U: Debug, V: Debug, Ret: Debug> Debug for UpdateStatement<T, U, V, Ret>where
T::FromClause: Debug,
impl<T: Debug + QuerySource, U: Debug, V: Debug, Ret: Debug> Debug for UpdateStatement<T, U, V, Ret>where
T::FromClause: Debug,
Source§impl<T, U, V, Ret, Predicate> FilterDsl<Predicate> for UpdateStatement<T, U, V, Ret>where
T: QuerySource,
U: WhereAnd<Predicate>,
Predicate: AppearsOnTable<T>,
impl<T, U, V, Ret, Predicate> FilterDsl<Predicate> for UpdateStatement<T, U, V, Ret>where
T: QuerySource,
U: WhereAnd<Predicate>,
Predicate: AppearsOnTable<T>,
Source§impl<T, U, V, Ret> Query for UpdateStatement<T, U, V, ReturningClause<Ret>>where
T: Table,
Ret: SelectableExpression<ReturningQuerySource<UpdateStmt, T>> + ValidGrouping<()>,
Ret::IsAggregate: MixedAggregates<No, Output = No>,
impl<T, U, V, Ret> Query for UpdateStatement<T, U, V, ReturningClause<Ret>>where
T: Table,
Ret: SelectableExpression<ReturningQuerySource<UpdateStmt, T>> + ValidGrouping<()>,
Ret::IsAggregate: MixedAggregates<No, Output = No>,
Source§impl<T, U, V, Ret, DB> QueryFragment<DB> for UpdateStatement<T, U, V, Ret>where
DB: Backend + DieselReserveSpecialization,
T: Table,
T::FromClause: QueryFragment<DB>,
U: QueryFragment<DB>,
V: QueryFragment<DB> + AllowFilterForUpdate<U>,
Ret: QueryFragment<DB>,
impl<T, U, V, Ret, DB> QueryFragment<DB> for UpdateStatement<T, U, V, Ret>where
DB: Backend + DieselReserveSpecialization,
T: Table,
T::FromClause: QueryFragment<DB>,
U: QueryFragment<DB>,
V: QueryFragment<DB> + AllowFilterForUpdate<U>,
Ret: QueryFragment<DB>,
Source§fn walk_ast<'b>(&'b self, out: AstPass<'_, 'b, DB>) -> QueryResult<()>
fn walk_ast<'b>(&'b self, out: AstPass<'_, 'b, DB>) -> QueryResult<()>
QueryFragment for all passes. Read moreSource§fn to_sql(&self, out: &mut DB::QueryBuilder, backend: &DB) -> QueryResult<()>
fn to_sql(&self, out: &mut DB::QueryBuilder, backend: &DB) -> QueryResult<()>
QueryFragment to its SQL representation. Read moreSource§fn collect_binds<'b>(
&'b self,
out: &mut DB::BindCollector<'b>,
metadata_lookup: &mut DB::MetadataLookup,
backend: &'b DB,
) -> QueryResult<()>
fn collect_binds<'b>( &'b self, out: &mut DB::BindCollector<'b>, metadata_lookup: &mut DB::MetadataLookup, backend: &'b DB, ) -> QueryResult<()>
Source§fn is_safe_to_cache_prepared(&self, backend: &DB) -> QueryResult<bool>
fn is_safe_to_cache_prepared(&self, backend: &DB) -> QueryResult<bool>
Source§impl<T, U, V, Ret> QueryId for UpdateStatement<T, U, V, Ret>where
T: QuerySource,
impl<T, U, V, Ret> QueryId for UpdateStatement<T, U, V, Ret>where
T: QuerySource,
Source§const HAS_STATIC_QUERY_ID: bool = false
const HAS_STATIC_QUERY_ID: bool = false
Self be uniquely identified by its type? Read moreSource§impl<S, T, U, V> ReturningClauseHelper<S> for UpdateStatement<T, U, V>where
T: QuerySource,
Available on crate feature i-implement-a-third-party-backend-and-opt-into-breaking-changes only.
impl<S, T, U, V> ReturningClauseHelper<S> for UpdateStatement<T, U, V>where
T: QuerySource,
i-implement-a-third-party-backend-and-opt-into-breaking-changes only.Source§type WithReturning = UpdateStatement<T, U, V, ReturningClause<S>>
type WithReturning = UpdateStatement<T, U, V, ReturningClause<S>>
Self with a RETURNING S clause attached.impl<T: QuerySource, U, V, Ret> RunQueryDslSupport for UpdateStatement<T, U, V, Ret>
Auto Trait Implementations§
impl<T, U, V, Ret> Freeze for UpdateStatement<T, U, V, Ret>
impl<T, U, V, Ret> RefUnwindSafe for UpdateStatement<T, U, V, Ret>where
<T as QuerySource>::FromClause: RefUnwindSafe,
U: RefUnwindSafe,
V: RefUnwindSafe,
Ret: RefUnwindSafe,
impl<T, U, V, Ret> Send for UpdateStatement<T, U, V, Ret>
impl<T, U, V, Ret> Sync for UpdateStatement<T, U, V, Ret>
impl<T, U, V, Ret> Unpin for UpdateStatement<T, U, V, Ret>
impl<T, U, V, Ret> UnsafeUnpin for UpdateStatement<T, U, V, Ret>where
<T as QuerySource>::FromClause: UnsafeUnpin,
U: UnsafeUnpin,
V: UnsafeUnpin,
Ret: UnsafeUnpin,
impl<T, U, V, Ret> UnwindSafe for UpdateStatement<T, U, V, Ret>
Blanket Implementations§
Source§impl<T> AggregateExpressionMethods for T
impl<T> AggregateExpressionMethods for T
Source§fn aggregate_distinct(self) -> AggregateDistinct<Self>where
Self: DistinctDsl,
fn aggregate_distinct(self) -> AggregateDistinct<Self>where
Self: DistinctDsl,
DISTINCT modifier for aggregate functions Read moreSource§fn aggregate_all(self) -> AggregateAll<Self>where
Self: AllDsl,
fn aggregate_all(self) -> AggregateAll<Self>where
Self: AllDsl,
ALL modifier for aggregate functions Read moreSource§fn aggregate_filter<P>(self, f: P) -> AggregateFilter<Self, P>
fn aggregate_filter<P>(self, f: P) -> AggregateFilter<Self, P>
Source§fn aggregate_order<O>(self, o: O) -> AggregateOrder<Self, O>where
Self: OrderAggregateDsl<O>,
fn aggregate_order<O>(self, o: O) -> AggregateOrder<Self, O>where
Self: OrderAggregateDsl<O>,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<Conn, DB, T> ExecuteDsl<Conn, DB> for T
impl<Conn, DB, T> ExecuteDsl<Conn, DB> for T
Source§impl<T> IntoSql for T
impl<T> IntoSql for T
Source§impl<'query, Conn, T, U, DB, B> LoadQuery<'query, Conn, U, B> for Twhere
Conn: Connection<Backend = DB> + LoadConnection<B>,
T: AsQuery + RunQueryDsl<Conn>,
<T as AsQuery>::Query: QueryFragment<DB> + QueryId + 'query,
<T as AsQuery>::SqlType: CompatibleType<U, DB>,
DB: Backend + QueryMetadata<<T as AsQuery>::SqlType> + 'static,
U: FromSqlRow<<<T as AsQuery>::SqlType as CompatibleType<U, DB>>::SqlType, DB> + 'static,
<<T as AsQuery>::SqlType as CompatibleType<U, DB>>::SqlType: 'static,
impl<'query, Conn, T, U, DB, B> LoadQuery<'query, Conn, U, B> for Twhere
Conn: Connection<Backend = DB> + LoadConnection<B>,
T: AsQuery + RunQueryDsl<Conn>,
<T as AsQuery>::Query: QueryFragment<DB> + QueryId + 'query,
<T as AsQuery>::SqlType: CompatibleType<U, DB>,
DB: Backend + QueryMetadata<<T as AsQuery>::SqlType> + 'static,
U: FromSqlRow<<<T as AsQuery>::SqlType as CompatibleType<U, DB>>::SqlType, DB> + 'static,
<<T as AsQuery>::SqlType as CompatibleType<U, DB>>::SqlType: 'static,
Source§type RowIter<'conn> = LoadIter<U, <Conn as LoadConnection<B>>::Cursor<'conn, 'query>, <<T as AsQuery>::SqlType as CompatibleType<U, DB>>::SqlType, DB>
where
Conn: 'conn
type RowIter<'conn> = LoadIter<U, <Conn as LoadConnection<B>>::Cursor<'conn, 'query>, <<T as AsQuery>::SqlType as CompatibleType<U, DB>>::SqlType, DB> where Conn: 'conn
LoadQuery::internal_loadSource§impl<T, DB> QueryFragmentForCachedStatement<DB> for T
impl<T, DB> QueryFragmentForCachedStatement<DB> for T
Source§impl<T, Conn> RunQueryDsl<Conn> for Twhere
T: RunQueryDslSupport,
impl<T, Conn> RunQueryDsl<Conn> for Twhere
T: RunQueryDslSupport,
Source§fn execute(self, conn: &mut Conn) -> QueryResult<usize>where
Conn: Connection,
Self: ExecuteDsl<Conn>,
fn execute(self, conn: &mut Conn) -> QueryResult<usize>where
Conn: Connection,
Self: ExecuteDsl<Conn>,
Source§fn load<'query, U>(self, conn: &mut Conn) -> QueryResult<Vec<U>>where
Self: LoadQuery<'query, Conn, U>,
fn load<'query, U>(self, conn: &mut Conn) -> QueryResult<Vec<U>>where
Self: LoadQuery<'query, Conn, U>,
Source§fn load_iter<'conn, 'query: 'conn, U, B>(
self,
conn: &'conn mut Conn,
) -> QueryResult<Self::RowIter<'conn>>where
U: 'conn,
Self: LoadQuery<'query, Conn, U, B> + 'conn,
fn load_iter<'conn, 'query: 'conn, U, B>(
self,
conn: &'conn mut Conn,
) -> QueryResult<Self::RowIter<'conn>>where
U: 'conn,
Self: LoadQuery<'query, Conn, U, B> + 'conn,
Source§fn get_result<'query, U>(self, conn: &mut Conn) -> QueryResult<U>where
Self: LoadQuery<'query, Conn, U>,
fn get_result<'query, U>(self, conn: &mut Conn) -> QueryResult<U>where
Self: LoadQuery<'query, Conn, U>,
Source§fn get_results<'query, U>(self, conn: &mut Conn) -> QueryResult<Vec<U>>where
Self: LoadQuery<'query, Conn, U>,
fn get_results<'query, U>(self, conn: &mut Conn) -> QueryResult<Vec<U>>where
Self: LoadQuery<'query, Conn, U>,
Vec with the affected rows. Read more