我正在构建一个 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 箱的文档,但没有任何效果。
我希望将查询结果发送到前端。
我个人还没有与 Tauri 进行任何开发,但根据他们的 guide,你应该能够像平常一样实现
serde::Deserialize
和 serde::Serialize
的特征并返回 Vec<Row>
。尽管如此,我认为将 Vec<Row>
结果映射到某个自定义结构,然后为其类型派生 Row
和 serde::Serialize
会更实用。如果您正在处理不同类型的结果,您可以使结果类型对函数通用,或者将结果类型包装在枚举类型中。