当前位置: 首页 > 知识库问答 >
问题:

postgresql - rust 使用 postgres crate 这个客户端,用select * 查询出来的结果用serde_json 序列化,怎么处理postgres 中的 TIMESTAMP 类型?

蒲昊
2023-08-21

使用 postgres rust 驱动,文档 https://docs.rs/postgres/latest/postgres/,

使用 select * 语句查询数据,在用 serde_json 序列化基本类型的时候正常,但是特殊类型就panic 了,如 时间戳类型 TIMESTAMP,代码如下

l  let query = format!("SELECT * FROM \"{}\".\"{}\";", &schema, &table);  let records = client.query(&query, &[]).expect("没有获取到结果");  let mut result: Vec<Map<String, Value>> = vec![];  for row in records.iter() {    let mut record = serde_json::Map::new();    for (i, column) in row.columns().iter().enumerate() {      let value: Value = match column.type_() {        &postgres::types::Type::INT4 => row.get::<_, i32>(i).into(),        &postgres::types::Type::TEXT => row.get::<_, String>(i).into(),        &postgres::types::Type::BOOL => row.get::<_, bool>(i).into(),        /// 这里报错        &postgres::types::Type::TIMESTAMP => row.get::<_, String>(i).into(),        // &postgres::types::Type::TIMESTAMP => {        //   row.get::<_, NaiveDateTime>(i).into()        // }        // Add more type conversions as needed        _ => Value::Null,      };      record.insert(column.name().to_string(), value);    }    result.push(record);  }  result

怎么处理 postgres 中的特殊类型如 TIMESTAMP 类型的序列化?

共有1个答案

石臻
2023-08-21
extern crate chrono;extern crate postgres;extern crate serde_json;extern crate serde;extern crate serde_derive;use chrono::NaiveDateTime;use postgres::{Client, NoTls};use serde_json::Value;use std::collections::HashMap as Map;fn main() {    let conn_str = "host=localhost user=postgres password=yourpassword dbname=yourdbname";    let mut client = Client::connect(conn_str, NoTls).expect("Failed to connect to DB");    let schema = "your_schema";    let table = "your_table";    let records = query_records(&mut client, &schema, &table);    println!("Records: {:?}", records);}fn query_records(client: &mut Client, schema: &str, table: &str) -> Vec<Map<String, Value>> {    let query = format!("SELECT * FROM \"{}\".\"{}\";", schema, table);    let records = client.query(&query, &[]).expect("Failed to fetch records");    let mut result: Vec<Map<String, Value>> = vec![];    for row in records.iter() {        let mut record = serde_json::Map::new();        for (i, column) in row.columns().iter().enumerate() {            let value: Value = match column.type_() {                &postgres::types::Type::INT4 => row.get::<_, i32>(i).into(),                &postgres::types::Type::TEXT => row.get::<_, String>(i).into(),                &postgres::types::Type::BOOL => row.get::<_, bool>(i).into(),                &postgres::types::Type::TIMESTAMP => {                    let dt = row.get::<_, NaiveDateTime>(i);                    let dt_string = serde_json::to_string(&dt.format("%Y-%m-%d %H:%M:%S").to_string()).unwrap();                    serde_json::from_str(&dt_string).unwrap()                }                _ => Value::Null,            };            record.insert(column.name().to_string(), value);        }        result.push(record);    }    result}

Cargo.toml文件:

[dependencies]postgres = "0.20.0"serde_json = "1.0.72"chrono = "0.4.19"serde = "1.0.130"serde_derive = "1.0.130"
 类似资料:
  • 我正在使用官方的Elasticsearch Java客户端。它工作得很好,但不幸的是,它的对象没有实现可序列化的接口。我特别需要序列化QueryBuilder的实例。 我发现了两种使用客户端序列化对象的方法。其中之一就是使用QueryBuilder。writeTo()。另一个是使用: 但是我找不到如何在这两种情况下反序列化对象。 我也不确定这是否是解决这项任务的最佳方式。

  • 问题内容: 自将我的Nest客户端升级到2.2.1之后,我无法看到要提交给我的elasticsearch客户端(现在为2.3.0版)的查询。我曾经用这条线: 但是,此方法现在返回void而不是它以前使用的JSON。ConnectionStatus也不存在,所以我再也看不到我发送的json了,有人知道吗?CallDetails.RequestBodyInBytes可用,但返回null。 问题答案:

  • 如何在Grafana的同一面板中使用来自不同查询的prometheus查询结果。 实例 我在格拉法纳有3个普罗米修斯查询,

  • 来自Teradata,我通常会创建一个包含一些变量的易失性表,我会在代码中使用这些变量。 例如。, 然后我会在SELECT WHERE子句中使用该表: 我试图在色调(Impala editor)中执行类似的操作,但遇到了一个错误: AnalysisException:第5行中的语法错误:未定义:来自表名隐藏^遇到:来自预期的:大小写、强制转换、默认值、存在、FALSE、IF、INTERVAL、NO

  • 这个 pgsql 报 syntax error as or "execption" 是为什么 ? 正确应该怎么写

  • 本文向大家介绍postgresql SELECT查询中的公用表表达式,包括了postgresql SELECT查询中的公用表表达式的使用技巧和注意事项,需要的朋友参考一下 示例 公用表表达式支持提取较大查询的部分。例如: