rust 使用 postgres crate 这个客户端,用select * 查询出来的结果怎么序列化成json?

作者站长头像
站长
· 阅读数 21

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

查询出来的结果,如果是知道当前表结构,可以使用 row.get 方法获取,代码如下:

let records = client.query("SELECT table_schema, table_catalog,table_name FROM information_schema.tables ");
 for row in records.iter() {
    let table_schema: &str = row.get(0);
    let table_catalog: &str = row.get(1);
    let table_name: &str = row.get(2);

    result.push(PgTable {
      table_schema: String::from(table_schema),
      table_catalog: String::from(table_catalog),
      table_name: String::from(table_name),
    });
  }

但是现在的需求是不知道每张表每列的数据类型和列名字,只能使用 select * 语句,该怎么序列化查询得到的records 对象。

let records = client.query("SELECT * From sometable ");
// 怎么序列化 records
回复
1个回答
avatar
test
2024-06-28

Cargo.toml:

[dependencies]
serde = "1.0"
serde_json = "1.0"

然后:

use postgres::{Client, NoTls};
use serde_json::Value;

fn main() {
    let mut client = Client::connect("host=localhost user=postgres password=yourpassword dbname=yourdbname", NoTls).unwrap();

    let records = client.query("SELECT * FROM sometable", &[]).unwrap();

    let mut result = Vec::new();

    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(),
                // Add more type conversions as needed
                _ => Value::Null,
            };
            record.insert(column.name().to_string(), value);
        }
        result.push(record);
    }

    let json = serde_json::to_string(&result).unwrap();
    println!("{}", json);
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容