FromQueryResult with prefix

This commit is contained in:
Chris Tsang 2021-05-12 12:48:54 +08:00
parent b5bc826b9b
commit 634b5aca7a
8 changed files with 38 additions and 52 deletions

View File

@ -104,10 +104,10 @@ impl ModelTrait for Model {
} }
} }
fn from_query_result(row: QueryResult) -> Result<Self, TypeErr> { fn from_query_result(row: QueryResult, pre: &str) -> Result<Self, TypeErr> {
Ok(Self { Ok(Self {
id: row.try_get(Column::Id.as_str())?, id: row.try_get(pre, Column::Id.as_str())?,
name: row.try_get(Column::Name.as_str())?, name: row.try_get(pre, Column::Name.as_str())?,
}) })
} }
} }

View File

@ -90,11 +90,11 @@ impl ModelTrait for Model {
} }
} }
fn from_query_result(row: QueryResult) -> Result<Self, TypeErr> { fn from_query_result(row: QueryResult, pre: &str) -> Result<Self, TypeErr> {
Ok(Self { Ok(Self {
id: row.try_get(Column::Id.as_str())?, id: row.try_get(pre, Column::Id.as_str())?,
name: row.try_get(Column::Name.as_str())?, name: row.try_get(pre, Column::Name.as_str())?,
cake_id: row.try_get(Column::CakeId.as_str())?, cake_id: row.try_get(pre, Column::CakeId.as_str())?,
}) })
} }
} }

View File

@ -93,10 +93,10 @@ async fn count_fruits_by_cake(db: &Database) -> Result<(), QueryErr> {
use sea_orm::{FromQueryResult, QueryResult, TypeErr}; use sea_orm::{FromQueryResult, QueryResult, TypeErr};
impl FromQueryResult for SelectResult { impl FromQueryResult for SelectResult {
fn from_query_result(row: QueryResult) -> Result<Self, TypeErr> { fn from_query_result(row: QueryResult, pre: &str) -> Result<Self, TypeErr> {
Ok(Self { Ok(Self {
name: row.try_get("name")?, name: row.try_get(pre, "name")?,
num_of_fruits: row.try_get("num_of_fruits")?, num_of_fruits: row.try_get(pre, "num_of_fruits")?,
}) })
} }
} }

View File

@ -3,7 +3,7 @@ use sea_query::{QueryBuilder, SelectStatement};
use std::marker::PhantomData; use std::marker::PhantomData;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct ModelSelect<M> pub struct SingleSelect<M>
where where
M: FromQueryResult, M: FromQueryResult,
{ {
@ -15,11 +15,11 @@ impl<E: 'static> Select<E>
where where
E: EntityTrait, E: EntityTrait,
{ {
pub fn into_model<M>(self) -> ModelSelect<M> pub fn into_model<M>(self) -> SingleSelect<M>
where where
M: FromQueryResult, M: FromQueryResult,
{ {
ModelSelect { SingleSelect {
query: self.query, query: self.query,
model: PhantomData, model: PhantomData,
} }
@ -34,38 +34,22 @@ where
} }
} }
impl<M> ModelSelect<M> impl<M> SingleSelect<M>
where where
M: FromQueryResult, 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<B>(&self, builder: B) -> Statement pub fn build<B>(&self, builder: B) -> Statement
where where
B: QueryBuilder, B: QueryBuilder,
{ {
self.as_query().build(builder).into() self.query.build(builder).into()
} }
pub async fn one(mut self, db: &Database) -> Result<M, QueryErr> { pub async fn one(mut self, db: &Database) -> Result<M, QueryErr> {
let builder = db.get_query_builder_backend(); 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?; 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<Vec<M>, QueryErr> { pub async fn all(self, db: &Database) -> Result<Vec<M>, QueryErr> {
@ -73,7 +57,7 @@ where
let rows = db.get_connection().query_all(self.build(builder)).await?; let rows = db.get_connection().query_all(self.build(builder)).await?;
let mut models = Vec::new(); let mut models = Vec::new();
for row in rows.into_iter() { for row in rows.into_iter() {
models.push(M::from_query_result(row)?); models.push(M::from_query_result(row, "")?);
} }
Ok(models) Ok(models)
} }

View File

@ -9,13 +9,13 @@ pub trait ModelTrait: Clone + Debug + Default {
fn set(&mut self, c: Self::Column, v: Value); fn set(&mut self, c: Self::Column, v: Value);
fn from_query_result(row: QueryResult) -> Result<Self, TypeErr> fn from_query_result(row: QueryResult, pre: &str) -> Result<Self, TypeErr>
where where
Self: Sized; Self: Sized;
} }
pub trait FromQueryResult { pub trait FromQueryResult {
fn from_query_result(row: QueryResult) -> Result<Self, TypeErr> fn from_query_result(row: QueryResult, pre: &str) -> Result<Self, TypeErr>
where where
Self: Sized; Self: Sized;
} }
@ -24,7 +24,7 @@ impl<M> FromQueryResult for M
where where
M: ModelTrait + Sized, M: ModelTrait + Sized,
{ {
fn from_query_result(row: QueryResult) -> Result<M, TypeErr> { fn from_query_result(row: QueryResult, pre: &str) -> Result<M, TypeErr> {
<Self as ModelTrait>::from_query_result(row) <Self as ModelTrait>::from_query_result(row, pre)
} }
} }

View File

@ -15,7 +15,7 @@ pub(crate) enum QueryResultRow {
pub struct TypeErr; pub struct TypeErr;
pub trait TryGetable { pub trait TryGetable {
fn try_get(res: &QueryResult, col: &str) -> Result<Self, TypeErr> fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TypeErr>
where where
Self: Sized; Self: Sized;
} }
@ -25,22 +25,24 @@ pub trait TryGetable {
macro_rules! try_getable { macro_rules! try_getable {
( $type: ty ) => { ( $type: ty ) => {
impl TryGetable for $type { impl TryGetable for $type {
fn try_get(res: &QueryResult, col: &str) -> Result<Self, TypeErr> { fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TypeErr> {
let column = format!("{}{}", pre, col);
match &res.row { match &res.row {
QueryResultRow::SqlxMySql(row) => { QueryResultRow::SqlxMySql(row) => {
use sqlx::Row; use sqlx::Row;
Ok(row.try_get(col)?) Ok(row.try_get(column.as_str())?)
} }
} }
} }
} }
impl TryGetable for Option<$type> { impl TryGetable for Option<$type> {
fn try_get(res: &QueryResult, col: &str) -> Result<Self, TypeErr> { fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TypeErr> {
let column = format!("{}{}", pre, col);
match &res.row { match &res.row {
QueryResultRow::SqlxMySql(row) => { QueryResultRow::SqlxMySql(row) => {
use sqlx::Row; use sqlx::Row;
match row.try_get(col) { match row.try_get(column.as_str()) {
Ok(v) => Ok(Some(v)), Ok(v) => Ok(Some(v)),
Err(_) => Ok(None), Err(_) => Ok(None),
} }
@ -67,11 +69,11 @@ try_getable!(String);
// QueryResult // // QueryResult //
impl QueryResult { impl QueryResult {
pub fn try_get<T>(&self, col: &str) -> Result<T, TypeErr> pub fn try_get<T>(&self, pre: &str, col: &str) -> Result<T, TypeErr>
where where
T: TryGetable, T: TryGetable,
{ {
T::try_get(self, col) T::try_get(self, pre, col)
} }
} }

View File

@ -104,10 +104,10 @@ impl ModelTrait for Model {
} }
} }
fn from_query_result(row: QueryResult) -> Result<Self, TypeErr> { fn from_query_result(row: QueryResult, pre: &str) -> Result<Self, TypeErr> {
Ok(Self { Ok(Self {
id: row.try_get(Column::Id.as_str())?, id: row.try_get(pre, Column::Id.as_str())?,
name: row.try_get(Column::Name.as_str())?, name: row.try_get(pre, Column::Name.as_str())?,
}) })
} }
} }

View File

@ -90,11 +90,11 @@ impl ModelTrait for Model {
} }
} }
fn from_query_result(row: QueryResult) -> Result<Self, TypeErr> { fn from_query_result(row: QueryResult, pre: &str) -> Result<Self, TypeErr> {
Ok(Self { Ok(Self {
id: row.try_get(Column::Id.as_str())?, id: row.try_get(pre, Column::Id.as_str())?,
name: row.try_get(Column::Name.as_str())?, name: row.try_get(pre, Column::Name.as_str())?,
cake_id: row.try_get(Column::CakeId.as_str())?, cake_id: row.try_get(pre, Column::CakeId.as_str())?,
}) })
} }
} }