This commit is contained in:
Billy Chan 2021-09-01 23:24:43 +08:00
parent 23f2a3d711
commit d664985ea9
No known key found for this signature in database
GPG Key ID: A2D690CAC7DF3CC7
3 changed files with 45 additions and 38 deletions

View File

@ -118,12 +118,25 @@ impl Entity {
} }
pub fn get_primary_key_rs_type(&self) -> TokenStream { pub fn get_primary_key_rs_type(&self) -> TokenStream {
if let Some(primary_key) = self.primary_keys.first() { let types = self
.primary_keys
.iter()
.map(|primary_key| {
self.columns self.columns
.iter() .iter()
.find(|col| col.name.eq(&primary_key.name)) .find(|col| col.name.eq(&primary_key.name))
.unwrap() .unwrap()
.get_rs_type() .get_rs_type()
.to_string()
})
.collect::<Vec<_>>();
if !types.is_empty() {
let value_type = if types.len() > 1 {
vec!["(".to_owned(), types.join(", "), ")".to_owned()]
} else {
types
};
value_type.join("").parse().unwrap()
} else { } else {
TokenStream::new() TokenStream::new()
} }

View File

@ -88,7 +88,7 @@ where
#[cfg(feature = "sqlx-postgres")] #[cfg(feature = "sqlx-postgres")]
DatabaseConnection::SqlxPostgresPoolConnection(conn) => { DatabaseConnection::SqlxPostgresPoolConnection(conn) => {
let res = conn.query_one(statement).await?.unwrap(); let res = conn.query_one(statement).await?.unwrap();
res.try_get("", "last_insert_id").unwrap_or_default() res.try_get_many("", "last_insert_id").unwrap_or_default()
} }
_ => { _ => {
let last_insert_id = db.execute(statement).await?.last_insert_id(); let last_insert_id = db.execute(statement).await?.last_insert_id();

View File

@ -262,9 +262,12 @@ impl TryGetable for Decimal {
.map_err(|e| TryGetError::DbErr(crate::sqlx_error_to_query_err(e)))?; .map_err(|e| TryGetError::DbErr(crate::sqlx_error_to_query_err(e)))?;
use rust_decimal::prelude::FromPrimitive; use rust_decimal::prelude::FromPrimitive;
match val { match val {
Some(v) => Decimal::from_f64(v) Some(v) => Decimal::from_f64(v).ok_or_else(|| {
.ok_or_else(|| TryGetError::DbErr(DbErr::Query("Failed to convert f64 into Decimal".to_owned()))), TryGetError::DbErr(DbErr::Query(
None => Err(TryGetError::Null) "Failed to convert f64 into Decimal".to_owned(),
))
}),
None => Err(TryGetError::Null),
} }
} }
#[cfg(feature = "mock")] #[cfg(feature = "mock")]
@ -282,22 +285,15 @@ try_getable_all!(uuid::Uuid);
// TryGetableMany // // TryGetableMany //
pub trait TryGetableMany: Sized { pub trait TryGetableMany: Sized {
fn try_get_many(res: &QueryResult, pre: &str, cols: &[String]) -> Result<Self, DbErr>; fn try_get_many(res: &QueryResult, pre: &str, cols: &[String]) -> Result<Self, TryGetError>;
} }
impl<T> TryGetableMany for T impl<T> TryGetableMany for T
where where
T: TryGetable, T: TryGetable,
{ {
fn try_get_many(res: &QueryResult, pre: &str, cols: &[String]) -> Result<Self, DbErr> { fn try_get_many(res: &QueryResult, pre: &str, cols: &[String]) -> Result<Self, TryGetError> {
let expect_len = 1; try_get_many_with_slice_len_of(1, cols)?;
if cols.len() < expect_len {
return Err(DbErr::Query(format!(
"Expect {} column names supplied but got slice of length {}",
expect_len,
cols.len()
)));
}
T::try_get(res, pre, &cols[0]) T::try_get(res, pre, &cols[0])
} }
} }
@ -306,15 +302,8 @@ impl<T> TryGetableMany for (T, T)
where where
T: TryGetable, T: TryGetable,
{ {
fn try_get_many(res: &QueryResult, pre: &str, cols: &[String]) -> Result<Self, DbErr> { fn try_get_many(res: &QueryResult, pre: &str, cols: &[String]) -> Result<Self, TryGetError> {
let expect_len = 2; try_get_many_with_slice_len_of(2, cols)?;
if cols.len() < expect_len {
return Err(DbErr::Query(format!(
"Expect {} column names supplied but got slice of length {}",
expect_len,
cols.len()
)));
}
Ok(( Ok((
T::try_get(res, pre, &cols[0])?, T::try_get(res, pre, &cols[0])?,
T::try_get(res, pre, &cols[1])?, T::try_get(res, pre, &cols[1])?,
@ -326,15 +315,8 @@ impl<T> TryGetableMany for (T, T, T)
where where
T: TryGetable, T: TryGetable,
{ {
fn try_get_many(res: &QueryResult, pre: &str, cols: &[String]) -> Result<Self, DbErr> { fn try_get_many(res: &QueryResult, pre: &str, cols: &[String]) -> Result<Self, TryGetError> {
let expect_len = 3; try_get_many_with_slice_len_of(3, cols)?;
if cols.len() < expect_len {
return Err(DbErr::Query(format!(
"Expect {} column names supplied but got slice of length {}",
expect_len,
cols.len()
)));
}
Ok(( Ok((
T::try_get(res, pre, &cols[0])?, T::try_get(res, pre, &cols[0])?,
T::try_get(res, pre, &cols[1])?, T::try_get(res, pre, &cols[1])?,
@ -343,6 +325,18 @@ where
} }
} }
fn try_get_many_with_slice_len_of(len: usize, cols: &[String]) -> Result<(), TryGetError> {
if cols.len() < len {
Err(TryGetError::DbErr(DbErr::Query(format!(
"Expect {} column names supplied but got slice of length {}",
len,
cols.len()
))))
} else {
Ok(())
}
}
// TryFromU64 // // TryFromU64 //
pub trait TryFromU64: Sized { pub trait TryFromU64: Sized {