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
回复
1个回答

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);
}
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容