首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当字段类型在编译时未知时,如何使用tokio-postgres枚举列?

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

Stack Overflow用户
提问于 2020-07-06 11:49:20
回答 1查看 791关注 0票数 4

我想要一个通用函数,它将SQL查询的结果转换为JSON。我想手动构建JSON字符串(或者使用外部库)。要做到这一点,我需要能够动态地枚举行中的列。

代码语言:javascript
复制
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,我如何枚举行和列?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-06 11:49:20

您需要枚举行和列,这样就可以在枚举时获得列引用,并从中获得postgresql类型。有了类型信息,就可以有条件逻辑来选择两个变量的不同子函数:( i)获得强类型变量;和( ii)转换为JSON值。

代码语言:javascript
复制
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处理新类型时,我还需要维护这段代码,因此,这种逻辑应该包含在库中,这样才能更好地维护这些功能。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62755435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档