use async_trait::async_trait; use sea_orm::{ prelude::Expr, sea_query::{Alias, IntoColumnRef, IntoTableRef, Query, SelectStatement}, ActiveModelTrait, ColumnTrait, ConnectionTrait, DbErr, EntityTrait, Insert, IntoActiveModel, Iterable, QueryResult, QueryTrait, SelectModel, SelectorRaw, Value, }; pub fn filter_values_in< I: IntoIterator, T: Into, R: IntoTableRef, C: IntoColumnRef + Copy, >( tbl_ref: R, col_ref: C, values: I, ) -> SelectStatement { Query::select() .expr(Expr::col((Alias::new("t"), Alias::new("column1")))) .from_values(values, Alias::new("t")) .left_join( tbl_ref, Expr::col((Alias::new("t"), Alias::new("column1"))).equals(col_ref), ) .and_where(Expr::col(col_ref).is_not_null()) .to_owned() } #[async_trait] pub trait InsertManyReturningExt: Sized where ::Model: IntoActiveModel, A: ActiveModelTrait, { fn exec_with_returning_models( self, db: &C, ) -> SelectorRaw::Model>> where C: ConnectionTrait; async fn exec_with_returning_columns( self, db: &C, columns: I, ) -> Result, DbErr> where C: ConnectionTrait, I: IntoIterator::Column> + Send; } #[async_trait] impl InsertManyReturningExt for Insert where ::Model: IntoActiveModel, A: ActiveModelTrait + Send, { fn exec_with_returning_models( self, db: &C, ) -> SelectorRaw::Model>> where C: ConnectionTrait, { let mut insert_statement = self.into_query(); let db_backend = db.get_database_backend(); let returning = Query::returning().exprs( ::Column::iter() .map(|c| c.select_as(c.into_returning_expr(db_backend))), ); insert_statement.returning(returning); let insert_statement = db_backend.build(&insert_statement); SelectorRaw::::Model>>::from_statement( insert_statement, ) } async fn exec_with_returning_columns( self, db: &C, columns: I, ) -> Result, DbErr> where C: ConnectionTrait, I: IntoIterator::Column> + Send, { let mut insert_statement = self.into_query(); let db_backend = db.get_database_backend(); let returning = Query::returning().exprs( columns .into_iter() .map(|c| c.select_as(c.into_returning_expr(db_backend))), ); insert_statement.returning(returning); let statement = db_backend.build(&insert_statement); db.query_all(statement).await } }