From afa28fbeab3d765c89acc5bb6bfb14e3a354fdf9 Mon Sep 17 00:00:00 2001 From: Billy Chan Date: Tue, 21 Dec 2021 18:13:51 +0800 Subject: [PATCH] feat(Model): add wrapper method delete --- README.md | 10 +++++++--- examples/actix4_example/src/main.rs | 6 ++---- examples/actix_example/src/main.rs | 6 ++---- examples/axum_example/src/main.rs | 6 ++---- examples/rocket_example/src/main.rs | 2 +- src/entity/model.rs | 17 +++++++++++++++-- src/lib.rs | 11 +++++++---- tests/active_enum_tests.rs | 2 +- tests/basic.rs | 2 +- tests/crud/deletes.rs | 12 ++---------- tests/crud/updates.rs | 2 +- tests/sequential_op_tests.rs | 3 +-- tests/transaction_tests.rs | 4 ++-- 13 files changed, 44 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 636fe59439..9f6e635d24 100644 --- a/README.md +++ b/README.md @@ -152,12 +152,16 @@ let banana = banana.save(db).await?; ``` ### Delete ```rust +// delete one let orange: Option = Fruit::find_by_id(1).one(db).await?; -let orange: fruit::ActiveModel = orange.unwrap().into(); +let orange: fruit::Model = orange.unwrap(); +fruit::Entity::delete(orange.into_active_model()) + .exec(db) + .await?; -// delete one -fruit::Entity::delete(orange).exec(db).await?; // or simply +let orange: Option = Fruit::find_by_id(1).one(db).await?; +let orange: fruit::Model = orange.unwrap(); orange.delete(db).await?; // delete many: DELETE FROM "fruit" WHERE "fruit"."name" LIKE 'Orange' diff --git a/examples/actix4_example/src/main.rs b/examples/actix4_example/src/main.rs index 6a52b81b10..8203754035 100644 --- a/examples/actix4_example/src/main.rs +++ b/examples/actix4_example/src/main.rs @@ -140,12 +140,10 @@ async fn update( async fn delete(data: web::Data, id: web::Path) -> Result { let conn = &data.conn; - let post: post::ActiveModel = Post::find_by_id(id.into_inner()) + let post: post::Model = Post::find_by_id(id.into_inner()) .one(conn) .await - .unwrap() - .unwrap() - .into(); + .unwrap(); post.delete(conn).await.unwrap(); diff --git a/examples/actix_example/src/main.rs b/examples/actix_example/src/main.rs index e2d1e95661..997b081a89 100644 --- a/examples/actix_example/src/main.rs +++ b/examples/actix_example/src/main.rs @@ -161,12 +161,10 @@ async fn delete( ) -> actix_flash::Response { let conn = &data.conn; - let post: post::ActiveModel = Post::find_by_id(id.into_inner()) + let post: post::Model = Post::find_by_id(id.into_inner()) .one(conn) .await - .unwrap() - .unwrap() - .into(); + .unwrap(); post.delete(conn).await.unwrap(); diff --git a/examples/axum_example/src/main.rs b/examples/axum_example/src/main.rs index 5c48d9dc3f..cb642906d8 100644 --- a/examples/axum_example/src/main.rs +++ b/examples/axum_example/src/main.rs @@ -202,12 +202,10 @@ async fn delete_post( Path(id): Path, mut cookies: Cookies, ) -> Result { - let post: post::ActiveModel = Post::find_by_id(id) + let post: post::Model = Post::find_by_id(id) .one(conn) .await - .unwrap() - .unwrap() - .into(); + .unwrap(); post.delete(conn).await.unwrap(); diff --git a/examples/rocket_example/src/main.rs b/examples/rocket_example/src/main.rs index 5ec1e52f11..0b5f746671 100644 --- a/examples/rocket_example/src/main.rs +++ b/examples/rocket_example/src/main.rs @@ -139,7 +139,7 @@ async fn edit(conn: Connection<'_, Db>, id: i32) -> Template { async fn delete(conn: Connection<'_, Db>, id: i32) -> Flash { let db = conn.into_inner(); - let post: post::ActiveModel = Post::find_by_id(id).one(db).await.unwrap().unwrap().into(); + let post: post::Model = Post::find_by_id(id).one(db).await.unwrap(); post.delete(db).await.unwrap(); diff --git a/src/entity/model.rs b/src/entity/model.rs index acea83d630..271493ef0d 100644 --- a/src/entity/model.rs +++ b/src/entity/model.rs @@ -1,11 +1,14 @@ use crate::{ - DbErr, EntityTrait, Linked, QueryFilter, QueryResult, Related, Select, SelectModel, - SelectorRaw, Statement, + ActiveModelBehavior, ActiveModelTrait, ConnectionTrait, DbErr, DeleteResult, EntityTrait, + IntoActiveModel, Linked, QueryFilter, QueryResult, Related, Select, SelectModel, SelectorRaw, + Statement, }; +use async_trait::async_trait; pub use sea_query::Value; use std::fmt::Debug; /// A Trait for a Model +#[async_trait] pub trait ModelTrait: Clone + Send + Debug { #[allow(missing_docs)] type Entity: EntityTrait; @@ -33,6 +36,16 @@ pub trait ModelTrait: Clone + Send + Debug { let tbl_alias = &format!("r{}", l.link().len() - 1); l.find_linked().belongs_to_tbl_alias(self, tbl_alias) } + + /// Delete an model + async fn delete<'a, A, C>(self, db: &'a C) -> Result + where + Self: IntoActiveModel, + C: ConnectionTrait<'a>, + A: ActiveModelTrait + ActiveModelBehavior + Send + 'a, + { + self.into_active_model().delete(db).await + } } /// A Trait for implementing a [QueryResult] diff --git a/src/lib.rs b/src/lib.rs index 81cf98a8fa..d1dde905ef 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -221,13 +221,16 @@ //! ``` //! # use sea_orm::{DbConn, error::*, entity::*, query::*, tests_cfg::*}; //! # async fn function(db: &DbConn) -> Result<(), DbErr> { +//! // delete one //! let orange: Option = Fruit::find_by_id(1).one(db).await?; -//! let orange: fruit::ActiveModel = orange.unwrap().into(); +//! let orange: fruit::Model = orange.unwrap(); +//! fruit::Entity::delete(orange.into_active_model()) +//! .exec(db) +//! .await?; //! -//! // delete one -//! fruit::Entity::delete(orange).exec(db).await?; //! // or simply -//! # let orange: fruit::ActiveModel = Fruit::find_by_id(1).one(db).await.unwrap().unwrap().into(); +//! let orange: Option = Fruit::find_by_id(1).one(db).await?; +//! let orange: fruit::Model = orange.unwrap(); //! orange.delete(db).await?; //! //! // delete many: DELETE FROM "fruit" WHERE "fruit"."name" LIKE 'Orange' diff --git a/tests/active_enum_tests.rs b/tests/active_enum_tests.rs index 4904cb40a1..7aae200269 100644 --- a/tests/active_enum_tests.rs +++ b/tests/active_enum_tests.rs @@ -89,7 +89,7 @@ pub async fn insert_active_enum(db: &DatabaseConnection) -> Result<(), DbErr> { .unwrap() ); - let res = model.into_active_model().delete(db).await?; + let res = model.delete(db).await?; assert_eq!(res.rows_affected, 1); assert_eq!(Entity::find().one(db).await?, None); diff --git a/tests/basic.rs b/tests/basic.rs index 51f300dae6..d7d342d1f9 100644 --- a/tests/basic.rs +++ b/tests/basic.rs @@ -81,7 +81,7 @@ async fn crud_cake(db: &DbConn) -> Result<(), DbErr> { apple ); - let apple: cake::ActiveModel = apple.unwrap().into(); + let apple: cake::Model = apple.unwrap(); let result = apple.delete(db).await?; diff --git a/tests/crud/deletes.rs b/tests/crud/deletes.rs index 01cfc7c20d..4c34d36b1f 100644 --- a/tests/crud/deletes.rs +++ b/tests/crud/deletes.rs @@ -29,11 +29,7 @@ pub async fn test_delete_cake(db: &DbConn) { let cakes = Cake::find().all(db).await.unwrap(); assert_eq!(cakes.len(), initial_cakes + 1); - let _result = cake - .into_active_model() - .delete(db) - .await - .expect("failed to delete cake"); + let _result = cake.delete(db).await.expect("failed to delete cake"); let cakes = Cake::find().all(db).await.unwrap(); assert_eq!(cakes.len(), initial_cakes); @@ -56,11 +52,7 @@ pub async fn test_delete_bakery(db: &DbConn) { initial_bakeries + 1 ); - let _result = bakery - .into_active_model() - .delete(db) - .await - .expect("failed to delete bakery"); + let _result = bakery.delete(db).await.expect("failed to delete bakery"); assert_eq!( Bakery::find().all(db).await.unwrap().len(), diff --git a/tests/crud/updates.rs b/tests/crud/updates.rs index b8ea6eb7d5..6c3cf690ab 100644 --- a/tests/crud/updates.rs +++ b/tests/crud/updates.rs @@ -110,7 +110,7 @@ pub async fn test_update_deleted_customer(db: &DbConn) { let customer_id = customer.id; - let _ = customer.into_active_model().delete(db).await; + let _ = customer.delete(db).await; assert_eq!(Customer::find().count(db).await.unwrap(), init_n_customers); let customer = customer::ActiveModel { diff --git a/tests/sequential_op_tests.rs b/tests/sequential_op_tests.rs index 8c7120c09d..de2e0dd84f 100644 --- a/tests/sequential_op_tests.rs +++ b/tests/sequential_op_tests.rs @@ -276,8 +276,7 @@ pub async fn test_delete_bakery(db: &DatabaseConnection) { } .save(db) .await - .expect("could not insert bakery") - .into_active_model(); + .expect("could not insert bakery"); assert_eq!( Bakery::find().all(db).await.unwrap().len(), diff --git a/tests/transaction_tests.rs b/tests/transaction_tests.rs index 34b8df22f8..7845843e06 100644 --- a/tests/transaction_tests.rs +++ b/tests/transaction_tests.rs @@ -408,7 +408,7 @@ pub async fn transaction_with_active_model_behaviour() -> Result<(), DbErr> { assert_eq!(cake::Entity::find().all(&txn).await?.len(), 2); assert_eq!( - readonly_cake_1.into_active_model().delete(&txn).await.err(), + readonly_cake_1.delete(&txn).await.err(), Some(DbErr::Custom( "[before_delete] Cannot be deleted".to_owned() )) @@ -428,7 +428,7 @@ pub async fn transaction_with_active_model_behaviour() -> Result<(), DbErr> { assert_eq!(cake::Entity::find().all(&txn).await?.len(), 3); assert_eq!( - readonly_cake_2.into_active_model().delete(&txn).await.err(), + readonly_cake_2.delete(&txn).await.err(), Some(DbErr::Custom("[after_delete] Cannot be deleted".to_owned())) );