FromQueryResult with prefix
This commit is contained in:
parent
b5bc826b9b
commit
634b5aca7a
@ -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())?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -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())?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -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")?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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())?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -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())?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user