postgresql 使用rust和postgres数据类型时出现的问题

bvjveswy  于 2023-02-12  发布在  PostgreSQL
关注(0)|答案(1)|浏览(268)

我试着做一个有 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中处理十进制值时遇到过类似的问题,我不得不将其更改为整数,并将相乘后的值保存在数据库中。是一个货币列,所以如果你也帮我解决这个问题,我可能会将其更改回来。
我希望有人能向我解释如何修复它,以及为什么会发生这种情况,这样我就可以避免在未来的数据类型方面寻求帮助。

gev0vcfq

gev0vcfq1#

问题出在附属物上。
看起来有些依赖项具有添加附加功能的特性。
我已经安装了Dependencie,没有任何功能,所以当我添加这些功能时,它开始工作,没有任何问题。
只需更改:

[dependencies]
postgres = "0.19.4"

致:

[dependencies]
postgres = { version = "0.19.4", features = ["with-chrono-0_4", "with-serde_json-1"] }

Chrono表示日期,serde_json表示jsonb。
我会检查小数问题,但我认为将是相同的解决方案。

相关问题