sqlx_model/curd/
delete.rs1use crate::WhereOption;
2
3use super::TableName;
4use super::{DbType, ModelTableField, ModelTableName};
5use sqlx::database::HasArguments;
6use sqlx::{Arguments, Database, Error, Executor, IntoArguments};
7
8pub 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}