将未知类型的PgRow值转换为字符串

3
我正在尝试“美化打印”查询结果。由于我不知道查询的内容,因此无法手动转换。我的想法是遍历 PgRow 的每个列信息,然后针对每个列获取其值。
以下是目前的代码:
fn row_to_json(row: PgRow) -> HashMap<String, String> {
    let mut result = HashMap::new();
    for col in row.columns() {
        let name = col.name();
        result.insert(name.to_string(), row.get(name));
    }

    result
}

然而,这会导致panic,因为row.get()不知道如何将任意类型转换为字符串(即使是整数)。我还尝试了serde_json::Value,但没有成功。
我该怎么做?有没有一种方法可以在Rust中表示任何SQL类型并将其转换为字符串,或者有没有更好的格式化行的方法?
1个回答

4

经过一些研究(以及来自Discord服务器的帮助),我解决了这个问题。问题在于 sqlx::query 返回的数据被编码为二进制形式,显然不容易转换为可读字符串。

如果直接在执行器(例如你的连接池)上调用 .fetch_* 方法,它将返回文本结果。结合修复后的代码,我能够获得一个合理的输出。

fn row_to_json(row: PgRow) -> HashMap<String, String> {
    let mut result = HashMap::new();
    for col in row.columns() {
        let value = row.try_get_raw(col.ordinal()).unwrap();
        let value = match value.is_null() {
            true => "NULL".to_string(),
            false => value.as_str().unwrap().to_string(),
        };
        result.insert(
            col.name().to_string(),
            value,
        );
    }

    result
}

对我来说,它正在说values.as_str()是一个私有方法。 - Ayan Banerjee
@AyanBanerjee 也许你正在使用较旧版本的sqlx。 - CircuitSacul
1
如果有人在尝试此解决方案时仍然遇到错误,原因是为了触发结果以文本形式返回,需要将&str传递给pool.fetch()方法,而不是由sqlx::query()返回的Query对象。这在此changelog中有解释,并且仅适用于Postgres和MySQL。 - Eduardo macedo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接