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 {
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())?,
})
}
}

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 {
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())?,
})
}
}

View File

@ -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<Self, TypeErr> {
fn from_query_result(row: QueryResult, pre: &str) -> Result<Self, TypeErr> {
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")?,
})
}
}

View File

@ -3,7 +3,7 @@ use sea_query::{QueryBuilder, SelectStatement};
use std::marker::PhantomData;
#[derive(Clone, Debug)]
pub struct ModelSelect<M>
pub struct SingleSelect<M>
where
M: FromQueryResult,
{
@ -15,11 +15,11 @@ impl<E: 'static> Select<E>
where
E: EntityTrait,
{
pub fn into_model<M>(self) -> ModelSelect<M>
pub fn into_model<M>(self) -> SingleSelect<M>
where
M: FromQueryResult,
{
ModelSelect {
SingleSelect {
query: self.query,
model: PhantomData,
}
@ -34,38 +34,22 @@ where
}
}
impl<M> ModelSelect<M>
impl<M> SingleSelect<M>
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<B>(&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<M, QueryErr> {
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<Vec<M>, 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)
}

View File

@ -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<Self, TypeErr>
fn from_query_result(row: QueryResult, pre: &str) -> Result<Self, TypeErr>
where
Self: Sized;
}
pub trait FromQueryResult {
fn from_query_result(row: QueryResult) -> Result<Self, TypeErr>
fn from_query_result(row: QueryResult, pre: &str) -> Result<Self, TypeErr>
where
Self: Sized;
}
@ -24,7 +24,7 @@ impl<M> FromQueryResult for M
where
M: ModelTrait + Sized,
{
fn from_query_result(row: QueryResult) -> Result<M, TypeErr> {
<Self as ModelTrait>::from_query_result(row)
fn from_query_result(row: QueryResult, pre: &str) -> Result<M, TypeErr> {
<Self as ModelTrait>::from_query_result(row, pre)
}
}

View File

@ -15,7 +15,7 @@ pub(crate) enum QueryResultRow {
pub struct TypeErr;
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
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<Self, TypeErr> {
fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TypeErr> {
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<Self, TypeErr> {
fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TypeErr> {
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<T>(&self, col: &str) -> Result<T, TypeErr>
pub fn try_get<T>(&self, pre: &str, col: &str) -> Result<T, TypeErr>
where
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 {
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())?,
})
}
}

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 {
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())?,
})
}
}