next_web_dev/middleware/database/
impl_query_wrapper.rs

1use async_trait::async_trait;
2use next_web_common::query::query_wrapper::{QueryWrapper, TableName, Wrapper};
3use rbatis::RBatis;
4use serde::de::DeserializeOwned;
5use std::result::Result as StdResult;
6
7type Result<V> = StdResult<V, rbatis::Error>;
8
9/// 可为执行器实现 trait
10#[async_trait]
11pub trait SelectWrapper {
12    async fn select_list<T, V>(&self, wrapper: QueryWrapper<'static, T>) -> Result<Vec<T>>
13    where
14        T: DeserializeOwned + TableName + Send + Sync + 'static,
15        V: DeserializeOwned,
16    {
17        self.execute(wrapper).await
18    }
19
20    async fn select_one<T, V>(&self, wrapper: QueryWrapper<'static, T>) -> Result<T>
21    where
22        T: DeserializeOwned + TableName + Send + Sync + 'static,
23        V: DeserializeOwned,
24    {
25        self.execute(wrapper).await
26    }
27
28    async fn select_count<T, V>(&self, wrapper: QueryWrapper<'static, T>) -> Result<usize>
29    where
30        T: DeserializeOwned + TableName + Send + Sync + 'static,
31        V: DeserializeOwned,
32    {
33        self.execute(wrapper.select(vec!["COUNT(1) as count"]))
34            .await
35    }
36
37    async fn execute<T, V>(&self, wrapper: QueryWrapper<'static, T>) -> Result<V>
38    where
39        T: DeserializeOwned + TableName + Send + Sync + 'static,
40        V: DeserializeOwned;
41}
42
43#[async_trait]
44impl SelectWrapper for RBatis {
45    async fn execute<T, V>(&self, wrapper: QueryWrapper<'static, T>) -> Result<V>
46    where
47        T: DeserializeOwned + TableName + Send + Sync + 'static,
48        V: DeserializeOwned,
49    {
50        self.query_decode(&wrapper.generate_sql(), vec![]).await
51    }
52}