我想要一个通用函数,它将SQL查询的结果转换为JSON。我想手动构建JSON字符串(或者使用外部库)。要做到这一点,我需要能够动态地枚举行中的列。
let rows = client
.query("select * from ExampleTable;")
.await?;
// This is how you read a string if you know the first column is a string type.
let thisValue: &str = rows[0].get(0);使用Rust可以使用动态类型。,但不是使用tokio库API。
tokio-postgres的row.get函数被设计为需要泛型推理根据源代码。
如果没有正确的API,我如何枚举行和列?
发布于 2020-07-06 11:49:20
您需要枚举行和列,这样就可以在枚举时获得列引用,并从中获得postgresql类型。有了类型信息,就可以有条件逻辑来选择两个变量的不同子函数:( i)获得强类型变量;和( ii)转换为JSON值。
for (rowIndex, row) in rows.iter().enumerate() {
for (colIndex, column) in row.columns().iter().enumerate() {
let colType: string = col.type_().to_string();
if colType == "int4" { //i32
let value: i32 = row.get(colIndex);
return value.to_string();
}
else if colType == "text" {
let value: &str = row.get(colIndex);
return value; //TODO: escape characters
}
//TODO: more type support
else {
//TODO: raise error
}
}
}东京-postgres代码维护人员额外提示()
理想情况下,tokio应该包括一个返回dyn any类型的直接API。row.rs的内部元素已经使用数据库列类型信息来确认所提供的泛型类型是否有效。理想情况下,新的API使用改进的FromSQL API直接使用内部列信息,但存在一个更简单的中间点:
在row.rs中可能会有一个额外的函数层,它使用这个答案中使用的相同列类型的条件逻辑,然后利用现有的get函数。如果像我这样的用户需要处理这种条件逻辑,那么当tokio-postgresql处理新类型时,我还需要维护这段代码,因此,这种逻辑应该包含在库中,这样才能更好地维护这些功能。
https://stackoverflow.com/questions/62755435
复制相似问题