use async_trait::async_trait; use sea_orm::{ ActiveModelTrait, ColumnTrait, ConnectionTrait, DbErr, EntityTrait, Insert, IntoActiveModel, QueryResult, QueryTrait, sea_query::Query, }; #[async_trait] pub trait InsertManyReturningExt: Sized where ::Model: IntoActiveModel, A: ActiveModelTrait, { 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, { 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 } }