我应该如何将 Postgres 箱中的 Vec<Row> 解析为 Rust 中的 Vec<String>?

问题描述 投票:0回答:1

我正在构建一个 tauri 应用程序,其中一些 SQL 查询将来自前端,而 rust 后端必须执行该查询。

我正在使用 postgres crate 来处理数据库查询。

运行查询会返回

Vec<Row>
,但我无法从 tauri 命令返回
Vec<Row>
,因此我尝试将其转换为
Vec<String>
。这里的问题是后端不知道结果中有多少列值,因为查询事先未知。

这是我的第一次尝试,但由于明显的类型转换错误,这不起作用。

#[tauri::command]
fn run_query(query: String) -> Result<Vec<String>, String> {
    let mut conn = database_util::get_db_connection();
    let result = match conn.query(query.as_str(), &[]) {
        Ok(res) => {
            let mut rows = Vec::new();
            for row in res {
                let mut row_str = String::new();
                for i in 0..row.len() {
                    let value: Option<String> = row.get(i);
                    row_str.push_str(&format!("{:?} ", value));
                }
                rows.push(row_str);
            }
            Ok(rows)
        },
        Err(err) => {
            Err(err.to_string())
        }
    };

    result
}

最后我写了这样的东西,但仍然是剩下多少列的问题。

#[tauri::command]
fn run_query(query: String) -> Result<Vec<String>, String> {
    let mut conn = database_util::get_db_connection();
    let result = match conn.query(query.as_str(), &[]) {
        Ok(res) => {
            let mut rows = Vec::new();
            for row in res {
                let mut row_str = String::new();
                let field_one: i32 = row.get(0);
                let field_two: Option<&str> = row.get(1);
                let field_three: Option<&str> = row.get(2);
                // ... there could be more fields depending on the query passed 
                row_str.push_str(&format!("{} {:?} {:?}", field_one, field_two, field_three));
                rows.push(row_str);
            }
            Ok(rows)
        },
        Err(err) => {
            Err(err.to_string())
        }
    };

    result
}

我来自 JS 背景,所以我对 Rust 世界还是新手,所以如果有其他方法来解决这个问题,请告诉我如何做。

我尝试谷歌搜索,阅读 postgres 箱的文档,但没有任何效果。

我希望将查询结果发送到前端。

postgresql rust tauri
1个回答
0
投票

我个人还没有与 Tauri 进行任何开发,但根据他们的 guide,你应该能够像平常一样实现

serde::Deserialize
serde::Serialize
的特征并返回
Vec<Row>
。尽管如此,我认为将
Vec<Row>
结果映射到某个自定义结构,然后为其类型派生
Row
serde::Serialize
会更实用。如果您正在处理不同类型的结果,您可以使结果类型对函数通用,或者将结果类型包装在枚举类型中。
    

© www.soinside.com 2019 - 2024. All rights reserved.