Skip to content

Commit

Permalink
feat(Model): add wrapper method delete
Browse files Browse the repository at this point in the history
  • Loading branch information
billy1624 committed Dec 21, 2021
1 parent 09fd9ba commit afa28fb
Show file tree
Hide file tree
Showing 13 changed files with 44 additions and 39 deletions.
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,12 +152,16 @@ let banana = banana.save(db).await?;
```
### Delete
```rust
// delete one
let orange: Option<fruit::Model> = 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::Model> = 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'
Expand Down
6 changes: 2 additions & 4 deletions examples/actix4_example/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,12 +140,10 @@ async fn update(
async fn delete(data: web::Data<AppState>, id: web::Path<i32>) -> Result<HttpResponse, Error> {
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();

Expand Down
6 changes: 2 additions & 4 deletions examples/actix_example/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -161,12 +161,10 @@ async fn delete(
) -> actix_flash::Response<HttpResponse, FlashData> {
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();

Expand Down
6 changes: 2 additions & 4 deletions examples/axum_example/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -202,12 +202,10 @@ async fn delete_post(
Path(id): Path<i32>,
mut cookies: Cookies,
) -> Result<PostResponse, (StatusCode, &'static str)> {
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();

Expand Down
2 changes: 1 addition & 1 deletion examples/rocket_example/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ async fn edit(conn: Connection<'_, Db>, id: i32) -> Template {
async fn delete(conn: Connection<'_, Db>, id: i32) -> Flash<Redirect> {
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();

Expand Down
17 changes: 15 additions & 2 deletions src/entity/model.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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<DeleteResult, DbErr>
where
Self: IntoActiveModel<A>,
C: ConnectionTrait<'a>,
A: ActiveModelTrait<Entity = Self::Entity> + ActiveModelBehavior + Send + 'a,
{
self.into_active_model().delete(db).await
}
}

/// A Trait for implementing a [QueryResult]
Expand Down
11 changes: 7 additions & 4 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::Model> = 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::Model> = 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'
Expand Down
2 changes: 1 addition & 1 deletion tests/active_enum_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion tests/basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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?;

Expand Down
12 changes: 2 additions & 10 deletions tests/crud/deletes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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(),
Expand Down
2 changes: 1 addition & 1 deletion tests/crud/updates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
3 changes: 1 addition & 2 deletions tests/sequential_op_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
4 changes: 2 additions & 2 deletions tests/transaction_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
))
Expand All @@ -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()))
);

Expand Down

0 comments on commit afa28fb

Please sign in to comment.