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

使用 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
阅读 3.3k
1 个回答

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);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题