Delete Statement
This commit is contained in:
parent
398e1f0913
commit
ff9e351ef1
217
src/query/delete.rs
Normal file
217
src/query/delete.rs
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
use crate::{
|
||||||
|
ActiveModelTrait, ColumnTrait, EntityTrait, IntoActiveModel, Iterable, PrimaryKeyToColumn,
|
||||||
|
QueryFilter, QueryTrait,
|
||||||
|
};
|
||||||
|
use core::marker::PhantomData;
|
||||||
|
use sea_query::{DeleteStatement, IntoIden};
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct Delete;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct DeleteOne<A>
|
||||||
|
where
|
||||||
|
A: ActiveModelTrait,
|
||||||
|
{
|
||||||
|
pub(crate) query: DeleteStatement,
|
||||||
|
pub(crate) model: A,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct DeleteMany<E>
|
||||||
|
where
|
||||||
|
E: EntityTrait,
|
||||||
|
{
|
||||||
|
pub(crate) query: DeleteStatement,
|
||||||
|
pub(crate) entity: PhantomData<E>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Delete {
|
||||||
|
/// Delete one Model or ActiveModel
|
||||||
|
///
|
||||||
|
/// Model
|
||||||
|
/// ```
|
||||||
|
/// use sea_orm::{entity::*, query::*, tests_cfg::cake, sea_query::PostgresQueryBuilder};
|
||||||
|
///
|
||||||
|
/// assert_eq!(
|
||||||
|
/// Delete::one(cake::Model {
|
||||||
|
/// id: 1,
|
||||||
|
/// name: "Apple Pie".to_owned(),
|
||||||
|
/// })
|
||||||
|
/// .build(PostgresQueryBuilder)
|
||||||
|
/// .to_string(),
|
||||||
|
/// r#"DELETE FROM "cake" WHERE "cake"."id" = 1"#,
|
||||||
|
/// );
|
||||||
|
/// ```
|
||||||
|
/// ActiveModel
|
||||||
|
/// ```
|
||||||
|
/// use sea_orm::{entity::*, query::*, tests_cfg::cake, sea_query::PostgresQueryBuilder};
|
||||||
|
///
|
||||||
|
/// assert_eq!(
|
||||||
|
/// Delete::one(cake::ActiveModel {
|
||||||
|
/// id: ActiveValue::set(1),
|
||||||
|
/// name: ActiveValue::set("Apple Pie".to_owned()),
|
||||||
|
/// })
|
||||||
|
/// .build(PostgresQueryBuilder)
|
||||||
|
/// .to_string(),
|
||||||
|
/// r#"DELETE FROM "cake" WHERE "cake"."id" = 1"#,
|
||||||
|
/// );
|
||||||
|
/// ```
|
||||||
|
pub fn one<E, A, M>(model: M) -> DeleteOne<A>
|
||||||
|
where
|
||||||
|
E: EntityTrait,
|
||||||
|
A: ActiveModelTrait<Entity = E>,
|
||||||
|
M: IntoActiveModel<A>,
|
||||||
|
{
|
||||||
|
let myself = DeleteOne {
|
||||||
|
query: DeleteStatement::new()
|
||||||
|
.from_table(A::Entity::default().into_iden())
|
||||||
|
.to_owned(),
|
||||||
|
model: model.into_active_model(),
|
||||||
|
};
|
||||||
|
myself.prepare()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Delete many ActiveModel
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use sea_orm::{entity::*, query::*, tests_cfg::fruit, sea_query::{Expr, PostgresQueryBuilder}};
|
||||||
|
///
|
||||||
|
/// assert_eq!(
|
||||||
|
/// Delete::many(fruit::Entity)
|
||||||
|
/// .filter(fruit::Column::Name.contains("Apple"))
|
||||||
|
/// .build(PostgresQueryBuilder)
|
||||||
|
/// .to_string(),
|
||||||
|
/// r#"DELETE FROM "fruit" WHERE "fruit"."name" LIKE '%Apple%'"#,
|
||||||
|
/// );
|
||||||
|
/// ```
|
||||||
|
pub fn many<E>(entity: E) -> DeleteMany<E>
|
||||||
|
where
|
||||||
|
E: EntityTrait,
|
||||||
|
{
|
||||||
|
DeleteMany {
|
||||||
|
query: DeleteStatement::new()
|
||||||
|
.from_table(entity.into_iden())
|
||||||
|
.to_owned(),
|
||||||
|
entity: PhantomData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<A> DeleteOne<A>
|
||||||
|
where
|
||||||
|
A: ActiveModelTrait,
|
||||||
|
{
|
||||||
|
pub(crate) fn prepare(mut self) -> Self {
|
||||||
|
for key in <A::Entity as EntityTrait>::PrimaryKey::iter() {
|
||||||
|
let col = key.into_column();
|
||||||
|
let av = self.model.get(col);
|
||||||
|
if av.is_set() || av.is_unchanged() {
|
||||||
|
self = self.filter(col.eq(av.unwrap()));
|
||||||
|
} else {
|
||||||
|
panic!("PrimaryKey is not set");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<A> QueryFilter for DeleteOne<A>
|
||||||
|
where
|
||||||
|
A: ActiveModelTrait,
|
||||||
|
{
|
||||||
|
type QueryStatement = DeleteStatement;
|
||||||
|
|
||||||
|
fn query(&mut self) -> &mut DeleteStatement {
|
||||||
|
&mut self.query
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> QueryFilter for DeleteMany<E>
|
||||||
|
where
|
||||||
|
E: EntityTrait,
|
||||||
|
{
|
||||||
|
type QueryStatement = DeleteStatement;
|
||||||
|
|
||||||
|
fn query(&mut self) -> &mut DeleteStatement {
|
||||||
|
&mut self.query
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<A> QueryTrait for DeleteOne<A>
|
||||||
|
where
|
||||||
|
A: ActiveModelTrait,
|
||||||
|
{
|
||||||
|
type QueryStatement = DeleteStatement;
|
||||||
|
|
||||||
|
fn query(&mut self) -> &mut DeleteStatement {
|
||||||
|
&mut self.query
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_query(&self) -> &DeleteStatement {
|
||||||
|
&self.query
|
||||||
|
}
|
||||||
|
|
||||||
|
fn into_query(self) -> DeleteStatement {
|
||||||
|
self.query
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> QueryTrait for DeleteMany<E>
|
||||||
|
where
|
||||||
|
E: EntityTrait,
|
||||||
|
{
|
||||||
|
type QueryStatement = DeleteStatement;
|
||||||
|
|
||||||
|
fn query(&mut self) -> &mut DeleteStatement {
|
||||||
|
&mut self.query
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_query(&self) -> &DeleteStatement {
|
||||||
|
&self.query
|
||||||
|
}
|
||||||
|
|
||||||
|
fn into_query(self) -> DeleteStatement {
|
||||||
|
self.query
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::tests_cfg::{cake, fruit};
|
||||||
|
use crate::{entity::*, query::*};
|
||||||
|
use sea_query::PostgresQueryBuilder;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn delete_1() {
|
||||||
|
assert_eq!(
|
||||||
|
Delete::one(cake::Model {
|
||||||
|
id: 1,
|
||||||
|
name: "Apple Pie".to_owned(),
|
||||||
|
})
|
||||||
|
.build(PostgresQueryBuilder)
|
||||||
|
.to_string(),
|
||||||
|
r#"DELETE FROM "cake" WHERE "cake"."id" = 1"#,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
Delete::one(cake::ActiveModel {
|
||||||
|
id: ActiveValue::set(1),
|
||||||
|
name: ActiveValue::set("Apple Pie".to_owned()),
|
||||||
|
})
|
||||||
|
.build(PostgresQueryBuilder)
|
||||||
|
.to_string(),
|
||||||
|
r#"DELETE FROM "cake" WHERE "cake"."id" = 1"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn delete_2() {
|
||||||
|
assert_eq!(
|
||||||
|
Delete::many(fruit::Entity)
|
||||||
|
.filter(fruit::Column::Name.contains("Cheese"))
|
||||||
|
.build(PostgresQueryBuilder)
|
||||||
|
.to_string(),
|
||||||
|
r#"DELETE FROM "fruit" WHERE "fruit"."name" LIKE '%Cheese%'"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
pub(crate) mod combine;
|
pub(crate) mod combine;
|
||||||
|
mod delete;
|
||||||
mod helper;
|
mod helper;
|
||||||
mod insert;
|
mod insert;
|
||||||
mod join;
|
mod join;
|
||||||
@ -10,6 +11,7 @@ mod traits;
|
|||||||
mod update;
|
mod update;
|
||||||
|
|
||||||
// pub use combine::*;
|
// pub use combine::*;
|
||||||
|
pub use delete::*;
|
||||||
pub use helper::*;
|
pub use helper::*;
|
||||||
pub use insert::*;
|
pub use insert::*;
|
||||||
pub use join::*;
|
pub use join::*;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user