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 {
|
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())?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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())?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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")?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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())?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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())?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user