1use crate::builder::QueryBuilder;
15use crate::sqlx_bind::SqlxDialect;
16
17impl<D: SqlxDialect> QueryBuilder<D> {
18 pub async fn fetch_all<'e, T, E>(&self, executor: E) -> Result<Vec<T>, sqlx::Error>
22 where
23 T: for<'r> sqlx::FromRow<'r, <D::Database as sqlx::Database>::Row> + Send + Unpin,
24 E: sqlx::Executor<'e, Database = D::Database>,
25 {
26 self.to_sqlx_query_as::<T>().fetch_all(executor).await
27 }
28
29 pub async fn fetch_one<'e, T, E>(&self, executor: E) -> Result<T, sqlx::Error>
33 where
34 T: for<'r> sqlx::FromRow<'r, <D::Database as sqlx::Database>::Row> + Send + Unpin,
35 E: sqlx::Executor<'e, Database = D::Database>,
36 {
37 self.to_sqlx_query_as::<T>().fetch_one(executor).await
38 }
39
40 pub async fn fetch_optional<'e, T, E>(&self, executor: E) -> Result<Option<T>, sqlx::Error>
42 where
43 T: for<'r> sqlx::FromRow<'r, <D::Database as sqlx::Database>::Row> + Send + Unpin,
44 E: sqlx::Executor<'e, Database = D::Database>,
45 {
46 self.to_sqlx_query_as::<T>().fetch_optional(executor).await
47 }
48
49 pub async fn execute<'e, E>(
54 &self,
55 executor: E,
56 ) -> Result<<D::Database as sqlx::Database>::QueryResult, sqlx::Error>
57 where
58 E: sqlx::Executor<'e, Database = D::Database>,
59 {
60 self.to_sqlx_query().execute(executor).await
61 }
62
63 pub async fn count<'e, E>(&self, executor: E) -> Result<i64, sqlx::Error>
69 where
70 E: sqlx::Executor<'e, Database = D::Database>,
71 i64: for<'r> sqlx::Decode<'r, D::Database> + sqlx::Type<D::Database>,
75 usize: sqlx::ColumnIndex<<D::Database as sqlx::Database>::Row>,
76 {
77 let (sql, binds) = self.to_sql();
78 let wrapped = format!("SELECT COUNT(*) FROM ({sql}) AS __cb_count");
79 let args = D::bind_arguments(&binds);
80 sqlx::query_scalar_with::<D::Database, i64, _>(sqlx::AssertSqlSafe(wrapped), args)
81 .fetch_one(executor)
82 .await
83 }
84
85 pub async fn fetch_scalar<'e, T, E>(&self, executor: E) -> Result<T, sqlx::Error>
90 where
91 T: for<'r> sqlx::Decode<'r, D::Database> + sqlx::Type<D::Database> + Send + Unpin,
92 E: sqlx::Executor<'e, Database = D::Database>,
93 usize: sqlx::ColumnIndex<<D::Database as sqlx::Database>::Row>,
96 {
97 let (sql, binds) = self.to_sql();
98 let args = D::bind_arguments(&binds);
99 sqlx::query_scalar_with::<D::Database, T, _>(sqlx::AssertSqlSafe(sql), args)
100 .fetch_one(executor)
101 .await
102 }
103
104 pub async fn fetch_optional_scalar<'e, T, E>(
106 &self,
107 executor: E,
108 ) -> Result<Option<T>, sqlx::Error>
109 where
110 T: for<'r> sqlx::Decode<'r, D::Database> + sqlx::Type<D::Database> + Send + Unpin,
111 E: sqlx::Executor<'e, Database = D::Database>,
112 usize: sqlx::ColumnIndex<<D::Database as sqlx::Database>::Row>,
113 {
114 let (sql, binds) = self.to_sql();
115 let args = D::bind_arguments(&binds);
116 sqlx::query_scalar_with::<D::Database, T, _>(sqlx::AssertSqlSafe(sql), args)
117 .fetch_optional(executor)
118 .await
119 }
120}