1- use crate :: { error:: * , ActiveModelTrait , ConnectionTrait , DeleteMany , DeleteOne , EntityTrait } ;
2- use sea_query:: DeleteStatement ;
1+ use crate :: {
2+ error:: * , ActiveModelTrait , ColumnTrait , ConnectionTrait , DeleteMany , DeleteOne , EntityTrait ,
3+ Iterable ,
4+ } ;
5+ use sea_query:: { DeleteStatement , Query } ;
36use std:: future:: Future ;
47
8+ use super :: { SelectModel , SelectorRaw } ;
9+
510/// Handles DELETE operations in a ActiveModel using [DeleteStatement]
611#[ derive( Clone , Debug ) ]
712pub struct Deleter {
2732 // so that self is dropped before entering await
2833 exec_delete_only ( self . query , db)
2934 }
35+
36+ /// Execute an delete operation and return the deleted model (use `RETURNING` syntax if supported)
37+ pub fn exec_with_returning < C > (
38+ self ,
39+ db : & ' a C ,
40+ ) -> impl Future < Output = Result < Option < <A :: Entity as EntityTrait >:: Model > , DbErr > > + ' _
41+ where
42+ C : ConnectionTrait ,
43+ {
44+ exec_delete_with_returning_one :: < A :: Entity , _ > ( self . query , db)
45+ }
3046}
3147
3248impl < ' a , E > DeleteMany < E >
4157 // so that self is dropped before entering await
4258 exec_delete_only ( self . query , db)
4359 }
60+
61+ /// Execute an delete operation and return the deleted model (use `RETURNING` syntax if supported)
62+ pub fn exec_with_returning < C > (
63+ self ,
64+ db : & C ,
65+ ) -> impl Future < Output = Result < Vec < E :: Model > , DbErr > > + ' _
66+ where
67+ E : EntityTrait ,
68+ C : ConnectionTrait ,
69+ {
70+ exec_delete_with_returning_many :: < E , _ > ( self . query , db)
71+ }
4472}
4573
4674impl Deleter {
@@ -56,6 +84,18 @@ impl Deleter {
5684 {
5785 exec_delete ( self . query , db)
5886 }
87+
88+ /// Execute an delete operation and return the deleted model (use `RETURNING` syntax if supported)
89+ pub fn exec_with_returning < E , C > (
90+ self ,
91+ db : & C ,
92+ ) -> impl Future < Output = Result < Vec < E :: Model > , DbErr > > + ' _
93+ where
94+ E : EntityTrait ,
95+ C : ConnectionTrait ,
96+ {
97+ exec_delete_with_returning_many :: < E , _ > ( self . query , db)
98+ }
5999}
60100
61101async fn exec_delete_only < C > ( query : DeleteStatement , db : & C ) -> Result < DeleteResult , DbErr >
@@ -77,3 +117,49 @@ where
77117 rows_affected : result. rows_affected ( ) ,
78118 } )
79119}
120+
121+ async fn exec_delete_with_returning_one < E , C > (
122+ mut query : DeleteStatement ,
123+ db : & C ,
124+ ) -> Result < Option < E :: Model > , DbErr >
125+ where
126+ E : EntityTrait ,
127+ C : ConnectionTrait ,
128+ {
129+ let models = match db. support_returning ( ) {
130+ true => {
131+ let db_backend = db. get_database_backend ( ) ;
132+ let delete_statement = db_backend. build ( & query. returning_all ( ) . to_owned ( ) ) ;
133+ SelectorRaw :: < SelectModel < <E >:: Model > > :: from_statement ( delete_statement)
134+ . one ( db)
135+ . await ?
136+ }
137+ false => unimplemented ! ( "Database backend doesn't support RETURNING" ) ,
138+ } ;
139+ Ok ( models)
140+ }
141+
142+ async fn exec_delete_with_returning_many < E , C > (
143+ mut query : DeleteStatement ,
144+ db : & C ,
145+ ) -> Result < Vec < E :: Model > , DbErr >
146+ where
147+ E : EntityTrait ,
148+ C : ConnectionTrait ,
149+ {
150+ let models = match db. support_returning ( ) {
151+ true => {
152+ let db_backend = db. get_database_backend ( ) ;
153+ let returning = Query :: returning ( ) . exprs (
154+ E :: Column :: iter ( ) . map ( |c| c. select_enum_as ( c. into_returning_expr ( db_backend) ) ) ,
155+ ) ;
156+ let query = query. returning ( returning) ;
157+ let delete_statement = db_backend. build ( & query. to_owned ( ) ) ;
158+ SelectorRaw :: < SelectModel < <E >:: Model > > :: from_statement ( delete_statement)
159+ . all ( db)
160+ . await ?
161+ }
162+ false => unimplemented ! ( "Database backend doesn't support RETURNING" ) ,
163+ } ;
164+ Ok ( models)
165+ }
0 commit comments