sqlx_model/curd/
delete.rs

1use crate::WhereOption;
2
3use super::TableName;
4use super::{DbType, ModelTableField, ModelTableName};
5use sqlx::database::HasArguments;
6use sqlx::{Arguments, Database, Error, Executor, IntoArguments};
7
8/// 删除操作
9pub struct Delete<DB>
10where
11    DB: Database,
12{
13    pub table_name: TableName,
14    _marker: std::marker::PhantomData<DB>,
15}
16impl<DB> Delete<DB>
17where
18    DB: Database,
19{
20    pub fn type_new<T1>() -> Delete<DB>
21    where
22        T1: ModelTableField<DB> + ModelTableName,
23    {
24        Delete {
25            table_name: T1::table_name(),
26            _marker: Default::default(),
27        }
28    }
29    pub fn new(table_name: TableName) -> Delete<DB> {
30        Delete {
31            table_name,
32            _marker: Default::default(),
33        }
34    }
35    pub async fn execute_by_where<'c, E>(
36        &self,
37        where_sql: &WhereOption,
38        executor: E,
39    ) -> Result<<DB as Database>::QueryResult, Error>
40    where
41        for<'n> <DB as HasArguments<'n>>::Arguments: Arguments<'n> + IntoArguments<'n, DB>,
42        E: Executor<'c, Database = DB>,
43    {
44        let sql = match where_sql {
45            WhereOption::Where(wsql) => {
46                format!("DELETE FROM {} WHERE {}", self.table_name.full_name(), wsql)
47            }
48            WhereOption::None => {
49                format!("DELETE FROM {} ", self.table_name.full_name())
50            }
51            WhereOption::NoWhere(other) => {
52                format!("DELETE FROM {} {}", self.table_name.full_name(), other)
53            }
54        };
55        let res = sqlx::query(sql.as_str());
56        executor.execute(res).await
57    }
58    pub async fn execute_by_pk<'c, T, E>(
59        &self,
60        source: &T,
61        executor: E,
62    ) -> Result<<DB as Database>::QueryResult, Error>
63    where
64        for<'n> <DB as HasArguments<'n>>::Arguments: Arguments<'n> + IntoArguments<'n, DB>,
65        T: ModelTableField<DB>,
66        E: Executor<'c, Database = DB>,
67    {
68        let pkf = T::table_pk();
69        let mut where_sql = vec![];
70        for (pos, val) in pkf.0.iter().enumerate() {
71            let bst = DbType::type_new::<DB>().mark(pos);
72            where_sql.push(format!("{}={}", val.name, bst));
73        }
74        let sql = format!(
75            "DELETE FROM {} WHERE {}",
76            self.table_name.full_name(),
77            where_sql.join(" and ")
78        );
79        let mut res = sqlx::query(sql.as_str());
80        for val in pkf.0.iter() {
81            res = source.query_sqlx_bind(val, res);
82        }
83        executor.execute(res).await
84    }
85    pub async fn execute_by_scalar_pk<'c, T, PT, E>(
86        &self,
87        pk_scalar: PT,
88        executor: E,
89    ) -> Result<<DB as Database>::QueryResult, Error>
90    where
91        for<'n> <DB as HasArguments<'n>>::Arguments: Arguments<'n> + IntoArguments<'n, DB>,
92        T: ModelTableField<DB>,
93        for<'q> PT: 'q + Send + sqlx::Encode<'q, DB> + sqlx::Type<DB>,
94        E: Executor<'c, Database = DB>,
95    {
96        let sql = format!(
97            "DELETE FROM {} WHERE {}",
98            self.table_name.full_name(),
99            scalar_pk_where!(DB, T::table_pk(), 0)
100        );
101        let mut res = sqlx::query(sql.as_str());
102        res = res.bind(pk_scalar);
103        executor.execute(res).await
104    }
105}