postgresql - 当字段类型在编译时未知时,如何使用tokio-postgres枚举列?

标签 postgresql rust rust-tokio

我想要一个将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);
Dynamic types are possible with Rust,但不能使用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应该包含直接返回dyn any类型的API。 row.rs内部已经使用数据库列类型信息来确认所提供的泛型类型有效。理想情况下,新API的使用将通过改进的FromSQL API直接直接使用内部列信息,但存在更简单的中间立场:-
row.rs中的一个附加功能层可能会使用此答案中使用的相同列类型条件逻辑,然后再利用现有的get函数。如果像我这样的用户需要处理这种条件逻辑,则当tokio-postgresql处理新类型时,我也需要维护此代码,因此,应在库中包含此类逻辑,这样可以更好地实现此功能。保持。

关于postgresql - 当字段类型在编译时未知时,如何使用tokio-postgres枚举列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62755435/

相关文章:

rust - 如何检查 `impl Trait` 类型的返回值借用检查?

rust - Rust Playground和本地计算机中reqwest示例的错误

database - 将数据库转储加载到 postgres 数据库中

postgresql 从两行创建一行

ruby-on-rails - 查询 Rails 模型中最常用的类别

rust - 如何将 tokio::timer::Timeout 与 Future::wait 一起使用?

compiler-errors - 找到预期的 XYZ ()

database - Liquibase 对 Postgres 和 Oracle 的支持

rust - C 结构到 Rust 的错误映射

rust - 如何表达闭包的生命周期限制以匹配特征有界生命周期?