Merge pull request #396 from SeaQL/active-value-continue
Add wrapper method `ModelTrait::delete`
This commit is contained in:
commit
65fe5910ec
12
README.md
12
README.md
@ -152,12 +152,16 @@ let banana = banana.save(db).await?;
|
|||||||
```
|
```
|
||||||
### Delete
|
### Delete
|
||||||
```rust
|
```rust
|
||||||
let orange: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?;
|
|
||||||
let orange: fruit::ActiveModel = orange.unwrap().into();
|
|
||||||
|
|
||||||
// delete one
|
// delete one
|
||||||
fruit::Entity::delete(orange).exec(db).await?;
|
let orange: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?;
|
||||||
|
let orange: fruit::Model = orange.unwrap();
|
||||||
|
fruit::Entity::delete(orange.into_active_model())
|
||||||
|
.exec(db)
|
||||||
|
.await?;
|
||||||
|
|
||||||
// or simply
|
// 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?;
|
orange.delete(db).await?;
|
||||||
|
|
||||||
// delete many: DELETE FROM "fruit" WHERE "fruit"."name" LIKE 'Orange'
|
// delete many: DELETE FROM "fruit" WHERE "fruit"."name" LIKE 'Orange'
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
DbErr, EntityTrait, Linked, QueryFilter, QueryResult, Related, Select, SelectModel,
|
ActiveModelBehavior, ActiveModelTrait, ConnectionTrait, DbErr, DeleteResult, EntityTrait,
|
||||||
SelectorRaw, Statement,
|
IntoActiveModel, Linked, QueryFilter, QueryResult, Related, Select, SelectModel, SelectorRaw,
|
||||||
|
Statement,
|
||||||
};
|
};
|
||||||
|
use async_trait::async_trait;
|
||||||
pub use sea_query::Value;
|
pub use sea_query::Value;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
||||||
/// A Trait for a Model
|
/// A Trait for a Model
|
||||||
|
#[async_trait]
|
||||||
pub trait ModelTrait: Clone + Send + Debug {
|
pub trait ModelTrait: Clone + Send + Debug {
|
||||||
#[allow(missing_docs)]
|
#[allow(missing_docs)]
|
||||||
type Entity: EntityTrait;
|
type Entity: EntityTrait;
|
||||||
@ -33,6 +36,16 @@ pub trait ModelTrait: Clone + Send + Debug {
|
|||||||
let tbl_alias = &format!("r{}", l.link().len() - 1);
|
let tbl_alias = &format!("r{}", l.link().len() - 1);
|
||||||
l.find_linked().belongs_to_tbl_alias(self, tbl_alias)
|
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]
|
/// A Trait for implementing a [QueryResult]
|
||||||
|
13
src/lib.rs
13
src/lib.rs
@ -221,13 +221,16 @@
|
|||||||
//! ```
|
//! ```
|
||||||
//! # use sea_orm::{DbConn, error::*, entity::*, query::*, tests_cfg::*};
|
//! # use sea_orm::{DbConn, error::*, entity::*, query::*, tests_cfg::*};
|
||||||
//! # async fn function(db: &DbConn) -> Result<(), DbErr> {
|
//! # async fn function(db: &DbConn) -> Result<(), DbErr> {
|
||||||
//! let orange: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?;
|
|
||||||
//! let orange: fruit::ActiveModel = orange.unwrap().into();
|
|
||||||
//!
|
|
||||||
//! // delete one
|
//! // delete one
|
||||||
//! fruit::Entity::delete(orange).exec(db).await?;
|
//! let orange: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?;
|
||||||
|
//! let orange: fruit::Model = orange.unwrap();
|
||||||
|
//! fruit::Entity::delete(orange.into_active_model())
|
||||||
|
//! .exec(db)
|
||||||
|
//! .await?;
|
||||||
|
//!
|
||||||
//! // or simply
|
//! // 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?;
|
//! orange.delete(db).await?;
|
||||||
//!
|
//!
|
||||||
//! // delete many: DELETE FROM "fruit" WHERE "fruit"."name" LIKE 'Orange'
|
//! // delete many: DELETE FROM "fruit" WHERE "fruit"."name" LIKE 'Orange'
|
||||||
|
@ -89,7 +89,7 @@ pub async fn insert_active_enum(db: &DatabaseConnection) -> Result<(), DbErr> {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
let res = model.into_active_model().delete(db).await?;
|
let res = model.delete(db).await?;
|
||||||
|
|
||||||
assert_eq!(res.rows_affected, 1);
|
assert_eq!(res.rows_affected, 1);
|
||||||
assert_eq!(Entity::find().one(db).await?, None);
|
assert_eq!(Entity::find().one(db).await?, None);
|
||||||
|
@ -81,7 +81,7 @@ async fn crud_cake(db: &DbConn) -> Result<(), DbErr> {
|
|||||||
apple
|
apple
|
||||||
);
|
);
|
||||||
|
|
||||||
let apple: cake::ActiveModel = apple.unwrap().into();
|
let apple: cake::Model = apple.unwrap();
|
||||||
|
|
||||||
let result = apple.delete(db).await?;
|
let result = apple.delete(db).await?;
|
||||||
|
|
||||||
|
@ -29,11 +29,7 @@ pub async fn test_delete_cake(db: &DbConn) {
|
|||||||
let cakes = Cake::find().all(db).await.unwrap();
|
let cakes = Cake::find().all(db).await.unwrap();
|
||||||
assert_eq!(cakes.len(), initial_cakes + 1);
|
assert_eq!(cakes.len(), initial_cakes + 1);
|
||||||
|
|
||||||
let _result = cake
|
let _result = cake.delete(db).await.expect("failed to delete cake");
|
||||||
.into_active_model()
|
|
||||||
.delete(db)
|
|
||||||
.await
|
|
||||||
.expect("failed to delete cake");
|
|
||||||
|
|
||||||
let cakes = Cake::find().all(db).await.unwrap();
|
let cakes = Cake::find().all(db).await.unwrap();
|
||||||
assert_eq!(cakes.len(), initial_cakes);
|
assert_eq!(cakes.len(), initial_cakes);
|
||||||
@ -56,11 +52,7 @@ pub async fn test_delete_bakery(db: &DbConn) {
|
|||||||
initial_bakeries + 1
|
initial_bakeries + 1
|
||||||
);
|
);
|
||||||
|
|
||||||
let _result = bakery
|
let _result = bakery.delete(db).await.expect("failed to delete bakery");
|
||||||
.into_active_model()
|
|
||||||
.delete(db)
|
|
||||||
.await
|
|
||||||
.expect("failed to delete bakery");
|
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Bakery::find().all(db).await.unwrap().len(),
|
Bakery::find().all(db).await.unwrap().len(),
|
||||||
|
@ -110,7 +110,7 @@ pub async fn test_update_deleted_customer(db: &DbConn) {
|
|||||||
|
|
||||||
let customer_id = customer.id;
|
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);
|
assert_eq!(Customer::find().count(db).await.unwrap(), init_n_customers);
|
||||||
|
|
||||||
let customer = customer::ActiveModel {
|
let customer = customer::ActiveModel {
|
||||||
|
@ -276,8 +276,7 @@ pub async fn test_delete_bakery(db: &DatabaseConnection) {
|
|||||||
}
|
}
|
||||||
.save(db)
|
.save(db)
|
||||||
.await
|
.await
|
||||||
.expect("could not insert bakery")
|
.expect("could not insert bakery");
|
||||||
.into_active_model();
|
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Bakery::find().all(db).await.unwrap().len(),
|
Bakery::find().all(db).await.unwrap().len(),
|
||||||
|
@ -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!(cake::Entity::find().all(&txn).await?.len(), 2);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
readonly_cake_1.into_active_model().delete(&txn).await.err(),
|
readonly_cake_1.delete(&txn).await.err(),
|
||||||
Some(DbErr::Custom(
|
Some(DbErr::Custom(
|
||||||
"[before_delete] Cannot be deleted".to_owned()
|
"[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!(cake::Entity::find().all(&txn).await?.len(), 3);
|
||||||
|
|
||||||
assert_eq!(
|
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()))
|
Some(DbErr::Custom("[after_delete] Cannot be deleted".to_owned()))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user