From 634b5aca7ad048f63210059e4c46b4c3e81579c2 Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Wed, 12 May 2021 12:48:54 +0800 Subject: [PATCH] FromQueryResult with prefix --- examples/sqlx-mysql/src/example_cake.rs | 6 ++--- examples/sqlx-mysql/src/example_fruit.rs | 8 +++--- examples/sqlx-mysql/src/main.rs | 6 ++--- src/connector/select.rs | 32 ++++++------------------ src/entity/model.rs | 8 +++--- src/query/result.rs | 16 ++++++------ src/tests_cfg/cake.rs | 6 ++--- src/tests_cfg/fruit.rs | 8 +++--- 8 files changed, 38 insertions(+), 52 deletions(-) diff --git a/examples/sqlx-mysql/src/example_cake.rs b/examples/sqlx-mysql/src/example_cake.rs index 3a821203..7f507724 100644 --- a/examples/sqlx-mysql/src/example_cake.rs +++ b/examples/sqlx-mysql/src/example_cake.rs @@ -104,10 +104,10 @@ impl ModelTrait for Model { } } - fn from_query_result(row: QueryResult) -> Result { + fn from_query_result(row: QueryResult, pre: &str) -> Result { Ok(Self { - id: row.try_get(Column::Id.as_str())?, - name: row.try_get(Column::Name.as_str())?, + id: row.try_get(pre, Column::Id.as_str())?, + name: row.try_get(pre, Column::Name.as_str())?, }) } } diff --git a/examples/sqlx-mysql/src/example_fruit.rs b/examples/sqlx-mysql/src/example_fruit.rs index 3f624f7f..a0774833 100644 --- a/examples/sqlx-mysql/src/example_fruit.rs +++ b/examples/sqlx-mysql/src/example_fruit.rs @@ -90,11 +90,11 @@ impl ModelTrait for Model { } } - fn from_query_result(row: QueryResult) -> Result { + fn from_query_result(row: QueryResult, pre: &str) -> Result { Ok(Self { - id: row.try_get(Column::Id.as_str())?, - name: row.try_get(Column::Name.as_str())?, - cake_id: row.try_get(Column::CakeId.as_str())?, + id: row.try_get(pre, Column::Id.as_str())?, + name: row.try_get(pre, Column::Name.as_str())?, + cake_id: row.try_get(pre, Column::CakeId.as_str())?, }) } } diff --git a/examples/sqlx-mysql/src/main.rs b/examples/sqlx-mysql/src/main.rs index c2c2094f..d08aeea3 100644 --- a/examples/sqlx-mysql/src/main.rs +++ b/examples/sqlx-mysql/src/main.rs @@ -93,10 +93,10 @@ async fn count_fruits_by_cake(db: &Database) -> Result<(), QueryErr> { use sea_orm::{FromQueryResult, QueryResult, TypeErr}; impl FromQueryResult for SelectResult { - fn from_query_result(row: QueryResult) -> Result { + fn from_query_result(row: QueryResult, pre: &str) -> Result { Ok(Self { - name: row.try_get("name")?, - num_of_fruits: row.try_get("num_of_fruits")?, + name: row.try_get(pre, "name")?, + num_of_fruits: row.try_get(pre, "num_of_fruits")?, }) } } diff --git a/src/connector/select.rs b/src/connector/select.rs index 3aa50359..a1f7769c 100644 --- a/src/connector/select.rs +++ b/src/connector/select.rs @@ -3,7 +3,7 @@ use sea_query::{QueryBuilder, SelectStatement}; use std::marker::PhantomData; #[derive(Clone, Debug)] -pub struct ModelSelect +pub struct SingleSelect where M: FromQueryResult, { @@ -15,11 +15,11 @@ impl Select where E: EntityTrait, { - pub fn into_model(self) -> ModelSelect + pub fn into_model(self) -> SingleSelect where M: FromQueryResult, { - ModelSelect { + SingleSelect { query: self.query, model: PhantomData, } @@ -34,38 +34,22 @@ where } } -impl ModelSelect +impl SingleSelect where M: FromQueryResult, { - /// Get a mutable ref to the query builder - pub fn query(&mut self) -> &mut SelectStatement { - &mut self.query - } - - /// Get an immutable ref to the query builder - pub fn as_query(&self) -> &SelectStatement { - &self.query - } - - /// Take ownership of the query builder - pub fn into_query(self) -> SelectStatement { - self.query - } - - /// Build the query as [`Statement`] pub fn build(&self, builder: B) -> Statement where B: QueryBuilder, { - self.as_query().build(builder).into() + self.query.build(builder).into() } pub async fn one(mut self, db: &Database) -> Result { let builder = db.get_query_builder_backend(); - self.query().limit(1); + self.query.limit(1); let row = db.get_connection().query_one(self.build(builder)).await?; - Ok(M::from_query_result(row)?) + Ok(M::from_query_result(row, "")?) } pub async fn all(self, db: &Database) -> Result, QueryErr> { @@ -73,7 +57,7 @@ where let rows = db.get_connection().query_all(self.build(builder)).await?; let mut models = Vec::new(); for row in rows.into_iter() { - models.push(M::from_query_result(row)?); + models.push(M::from_query_result(row, "")?); } Ok(models) } diff --git a/src/entity/model.rs b/src/entity/model.rs index 328385c2..0bc68c31 100644 --- a/src/entity/model.rs +++ b/src/entity/model.rs @@ -9,13 +9,13 @@ pub trait ModelTrait: Clone + Debug + Default { fn set(&mut self, c: Self::Column, v: Value); - fn from_query_result(row: QueryResult) -> Result + fn from_query_result(row: QueryResult, pre: &str) -> Result where Self: Sized; } pub trait FromQueryResult { - fn from_query_result(row: QueryResult) -> Result + fn from_query_result(row: QueryResult, pre: &str) -> Result where Self: Sized; } @@ -24,7 +24,7 @@ impl FromQueryResult for M where M: ModelTrait + Sized, { - fn from_query_result(row: QueryResult) -> Result { - ::from_query_result(row) + fn from_query_result(row: QueryResult, pre: &str) -> Result { + ::from_query_result(row, pre) } } diff --git a/src/query/result.rs b/src/query/result.rs index fb72349a..713fbb87 100644 --- a/src/query/result.rs +++ b/src/query/result.rs @@ -15,7 +15,7 @@ pub(crate) enum QueryResultRow { pub struct TypeErr; pub trait TryGetable { - fn try_get(res: &QueryResult, col: &str) -> Result + fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result where Self: Sized; } @@ -25,22 +25,24 @@ pub trait TryGetable { macro_rules! try_getable { ( $type: ty ) => { impl TryGetable for $type { - fn try_get(res: &QueryResult, col: &str) -> Result { + fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result { + let column = format!("{}{}", pre, col); match &res.row { QueryResultRow::SqlxMySql(row) => { use sqlx::Row; - Ok(row.try_get(col)?) + Ok(row.try_get(column.as_str())?) } } } } impl TryGetable for Option<$type> { - fn try_get(res: &QueryResult, col: &str) -> Result { + fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result { + let column = format!("{}{}", pre, col); match &res.row { QueryResultRow::SqlxMySql(row) => { use sqlx::Row; - match row.try_get(col) { + match row.try_get(column.as_str()) { Ok(v) => Ok(Some(v)), Err(_) => Ok(None), } @@ -67,11 +69,11 @@ try_getable!(String); // QueryResult // impl QueryResult { - pub fn try_get(&self, col: &str) -> Result + pub fn try_get(&self, pre: &str, col: &str) -> Result where T: TryGetable, { - T::try_get(self, col) + T::try_get(self, pre, col) } } diff --git a/src/tests_cfg/cake.rs b/src/tests_cfg/cake.rs index d36c4e8a..6c5eb6f2 100644 --- a/src/tests_cfg/cake.rs +++ b/src/tests_cfg/cake.rs @@ -104,10 +104,10 @@ impl ModelTrait for Model { } } - fn from_query_result(row: QueryResult) -> Result { + fn from_query_result(row: QueryResult, pre: &str) -> Result { Ok(Self { - id: row.try_get(Column::Id.as_str())?, - name: row.try_get(Column::Name.as_str())?, + id: row.try_get(pre, Column::Id.as_str())?, + name: row.try_get(pre, Column::Name.as_str())?, }) } } diff --git a/src/tests_cfg/fruit.rs b/src/tests_cfg/fruit.rs index 1aa8d21f..ce068129 100644 --- a/src/tests_cfg/fruit.rs +++ b/src/tests_cfg/fruit.rs @@ -90,11 +90,11 @@ impl ModelTrait for Model { } } - fn from_query_result(row: QueryResult) -> Result { + fn from_query_result(row: QueryResult, pre: &str) -> Result { Ok(Self { - id: row.try_get(Column::Id.as_str())?, - name: row.try_get(Column::Name.as_str())?, - cake_id: row.try_get(Column::CakeId.as_str())?, + id: row.try_get(pre, Column::Id.as_str())?, + name: row.try_get(pre, Column::Name.as_str())?, + cake_id: row.try_get(pre, Column::CakeId.as_str())?, }) } }