当字段类型在编译时未知时,如何使用 tokio-postgres 枚举列?
How to enumerate over columns with tokio-postgres when the field types are unknown at compile-time?
我想要一个将 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);
,但不适用于 tokio-postgres 库 API。
tokio-postgres 的 row.get
函数被设计为需要泛型推理 according to the source code
没有权限API,如何枚举行列?
您需要枚举行和列,这样您可以在枚举时获取列引用,并从中获取 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
}
}
}
tokio-postgres 代码维护者的额外提示
理想情况下,tokio-postgres 会包含一个直接的 API,returns 一个 dyn any
类型。 row.rs 的内部已经使用数据库列类型信息来确认提供的泛型类型是有效的。理想情况下,新的 API 用途将通过改进的 FromSQL API 非常直接地使用内部列信息,但存在更简单的中间立场:-
row.rs 中的额外功能层可能会使用此答案中使用的相同列类型条件逻辑,然后利用现有的 get
功能。如果像我这样的用户需要处理这种条件逻辑,我也需要在tokio-postgresql处理新类型时维护这段代码,因此,这种逻辑应该包含在库中,这样的功能可以更好维护。
我想要一个将 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);
tokio-postgres 的 row.get
函数被设计为需要泛型推理 according to the source code
没有权限API,如何枚举行列?
您需要枚举行和列,这样您可以在枚举时获取列引用,并从中获取 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
}
}
}
tokio-postgres 代码维护者的额外提示
理想情况下,tokio-postgres 会包含一个直接的 API,returns 一个 dyn any
类型。 row.rs 的内部已经使用数据库列类型信息来确认提供的泛型类型是有效的。理想情况下,新的 API 用途将通过改进的 FromSQL API 非常直接地使用内部列信息,但存在更简单的中间立场:-
row.rs 中的额外功能层可能会使用此答案中使用的相同列类型条件逻辑,然后利用现有的 get
功能。如果像我这样的用户需要处理这种条件逻辑,我也需要在tokio-postgresql处理新类型时维护这段代码,因此,这种逻辑应该包含在库中,这样的功能可以更好维护。