diff --git a/ensemble/src/query.rs b/ensemble/src/query.rs index 4bfd0b4..c30ca83 100644 --- a/ensemble/src/query.rs +++ b/ensemble/src/query.rs @@ -306,11 +306,16 @@ impl Builder { .await .map_err(|e| Error::Database(e.to_string()))?; - values.first().and_then(Value::as_u64).ok_or_else(|| { - Error::Serialization(rbs::value::ext::Error::Syntax( - "Failed to parse count value".to_string(), - )) - }) + values + .first() + .and_then(|m| m.as_map()) + .and_then(|m| m.first()) + .and_then(|(_, v)| v.as_u64()) + .ok_or_else(|| { + Error::Serialization(rbs::value::ext::Error::Syntax( + "Failed to parse count value".to_string(), + )) + }) } /// Execute the query and return the first result. @@ -392,7 +397,7 @@ impl Builder { pub async fn insert serde::Deserialize<'de>, T: Into + Send>( &self, columns: T, - ) -> Result { + ) -> Result, Error> { if self.limit.is_some() || !self.join.is_empty() || !self.order.is_empty() @@ -421,7 +426,7 @@ impl Builder { .await .map_err(|e| Error::Database(e.to_string()))?; - Ok(rbs::from_value(result.last_insert_id)?) + Ok(rbs::from_value(result.last_insert_id).ok()) } /// Increment a column's value by a given amount. Returns the number of affected rows. diff --git a/ensemble_derive/src/model/mod.rs b/ensemble_derive/src/model/mod.rs index 137973f..6165785 100644 --- a/ensemble_derive/src/model/mod.rs +++ b/ensemble_derive/src/model/mod.rs @@ -270,13 +270,13 @@ fn impl_create(name: &Ident, fields: &Fields, primary_key: &Field) -> TokenStrea { let primary_key = &primary_key.ident; quote! { - self.#primary_key = Self::query().insert(::ensemble::value::for_db(&self)?).await?; + self.#primary_key = Self::query().insert(::ensemble::value::for_db(&self)?).await?.ok_or(::ensemble::Error::Database("failed to retrieve primary key".to_string()))?; Ok(self) } } else { quote! { - Self::query().insert(::ensemble::value::for_db(&self)?).await?; + Self::query().insert::(::ensemble::value::for_db(&self)?).await?; Ok(self) }