【问题标题】:Rust tokio_postgres row to object mapping fails with serde_postgres for timestamp columnRust tokio_postgres 行到对象映射失败,时间戳列的 serde_postgres
【发布时间】:2021-03-21 23:32:33
【问题描述】:

我有 rust actix-web rest 项目,它使用 tokio_postgres 和 serde_postgres。

表格

acme=# \d job
                                             Table "public.job"
     Column      |            Type             | Collation | Nullable |               Default               
-----------------+-----------------------------+-----------+----------+-------------------------------------
 created_at      | timestamp without time zone |           | not null | CURRENT_TIMESTAMP

结构

#[derive(Debug, Deserialize, Serialize)]
pub struct Job {
    pub created_at: NaiveDateTime,
}

函数

pub async fn get_all_jobs(&self) -> Result<Vec<Job>, Error> {
        let client = self.pool.get_conn().await?;
        let query = "SELECT created_at FROM job";

        let rows = &client.query(query, &[]).await?;
        // ------------ Following line throws error --------------
        let jobs: Vec<Job> = from_rows(rows)?;

        // ------------ Following lines works fine ---------------
        // let mut jobs: Vec<Job> = Vec::new();
        // for row in rows {
        //    jobs.push(Job {
        //        created_at: row.get(0)
        //    })
        // }

        Ok(jobs)
    }

Cargo.toml

tokio = { version = "0.3", features = ["full"] }
serde = "1.0.117"
serde_derive = "1.0.117"
serde_json = "1.0.60"
serde_postgres = "0.2.0"
thiserror = "1.0.22"
tokio-postgres = { version = "0.5", features = ["with-uuid-0_8", "with-chrono-0_4"] }

当我遍历rows 并手动将每一行映射到Job 结构时,上面的代码完美执行。我不喜欢这种手动方法,其中 serde_postgres::from_rows 是为相同的任务而设计的,但它仅适用于 timestamp without time zone 类型的列。

我怀疑这是版本不匹配的问题,如果不是我遗漏了一些东西。如果有人可以分享一些想法/解决方案,那将是一个很大的帮助

【问题讨论】:

    标签: rust serde rust-tokio tokio-postgres


    【解决方案1】:

    似乎 serde_postgres crate 不支持日期时间。参考this

    所以我实现了 from_rows like this

    impl From<&Row> for Job {
        fn from(row: &Row) -> Self {
            Self {
                created_at: row.get("created_at")
            }
        }
    }
    

    这行得通。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 2011-10-01
      • 2019-08-06
      • 2015-11-22
      相关资源
      最近更新 更多