我试着做一个有 rust 和postres的Api REST,但我不能让它工作,因为这两者之间的关系。
实际的问题是我在postgres中有一个列是jsonb,当我返回数据并试图将其保存在结构体中时总是出错,当我试图保存数据时也是同样的问题。
这是模型。(选项只是因为我测试的东西,它应该返回一个值)
#[derive(Debug, Serialize, Deserialize)]
pub struct CategoryView {
pub id: i32,
pub category_name: String,
pub category_custom_fields: Option<serde_json::Value>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CategoryPayload {
pub category_name: String,
pub category_custom_fields: Option<serde_json::Value>,
}
以下是postgres查询:
fn find_all(conn: &mut DbPooled) -> Result<Vec<CategoryView>, DbError> {
let mut query = "SELECT id, category_name, category_custom_fields FROM accounting.categories".to_owned();
query.push_str(" WHERE user_id = $1");
query.push_str(" AND is_deleted = false");
let items = conn.query(&query, &[&unsafe { CURRENT_USER.to_owned() }])?;
let items_view: Vec<CategoryView> = items
.iter()
.map(|h| CategoryView {
id: h.get("id"),
category_name: h.get("category_name"),
category_custom_fields: h.get("category_custom_fields"),
})
.collect();
Ok(items_view)
}
fn add(payload: &CategoryPayload, conn: &mut DbPooled) -> Result<CategoryView, DbError> {
let mut query =
"INSERT INTO accounting.categories (user_id, category_name, category_custom_fields, create_date, update_date)"
.to_owned();
query.push_str(" VALUES ($1, $2, $3, now(), now())");
query.push_str(" RETURNING id");
let item_id = conn
.query_one(
&query,
&[
&unsafe { CURRENT_USER.to_owned() },
&payload.category_name,
&payload.category_custom_fields,
],
)?
.get(0);
let inserted_item = CategoryView {
id: item_id,
category_name: payload.category_name.to_string(),
category_custom_fields: payload.category_custom_fields,
};
Ok(inserted_item)
}
与更新发生,但我认为是相同的解决方案,一个形式的添加功能。
错误为:
the trait bound `serde_json::Value: ToSql` is not satisfied
the following other types implement trait `ToSql`:
&'a T
&'a [T]
&'a [u8]
&'a str
Box<[T]>
Box<str>
Cow<'a, str>
HashMap<std::string::String, std::option::Option<std::string::String>, H>
and 17 others
required for `std::option::Option<serde_json::Value>` to implement `ToSql`
required for the cast from `std::option::Option<serde_json::Value>` to the object type `dyn ToSql + Sync`rustcClick for full compiler diagnostic`
因为我读到的serde_json::Value
相当于jsonb,所以我不理解它。
我以前在postgres中处理十进制值时遇到过类似的问题,我不得不将其更改为整数,并将相乘后的值保存在数据库中。是一个货币列,所以如果你也帮我解决这个问题,我可能会将其更改回来。
我希望有人能向我解释如何修复它,以及为什么会发生这种情况,这样我就可以避免在未来的数据类型方面寻求帮助。
1条答案
按热度按时间gev0vcfq1#
问题出在附属物上。
看起来有些依赖项具有添加附加功能的特性。
我已经安装了Dependencie,没有任何功能,所以当我添加这些功能时,它开始工作,没有任何问题。
只需更改:
致:
Chrono表示日期,serde_json表示jsonb。
我会检查小数问题,但我认为将是相同的解决方案。