通过 Vec <Row>从 MySQL 读取数据



通过Vec<Row>从MySQL读取数据的最佳(简单、安全和高效(方式是什么?

下面是一个使用(特定(元组向量的示例函数:

fn read_recs(tx: &mut Transaction) -> Result<HashMap<i64, String>> {
let q = format!("SELECT id, name FROM some_table");
let rows: Vec<(i64, String)> = tx.query(q)?;
let mut res = HashMap::new();
for r in rows {
res.insert(r.0, r.1);
}
Ok(res)
}

对于简单的查询,我发现这种方法已经足够好了(以及query_map()(,但对于返回更多列的查询,我们更喜欢直接读取Vec<Row>,然后以某种方式以简单(不太冗长(的方式读取值,如下所示:

let rows: Vec<Row> = tx.query(q)?;
for r in rows {
let id: i64 = extract(r, 0)?;
let name: String = extract(r, 1)?;
}

甚至可能是这样:

let rows: Vec<Row> = tx.query(q)?;
for r in rows {
let id: i64 = extract(r, "id")?;
let name: String = extract(r, "name")?;
}

问题是,如果extract成功读取数据或返回错误,它会是什么样子?我不希望它恐慌,例如,在我只期望非null值的情况下,查询返回NULL。显然,我更希望每次从字段读取数据时都必须处理Option<...>值,而不是,因为这会使我的代码过于冗长。

顺便说一句,如果重要的话,我会使用Anyhow

我不知道我是否完全理解这个问题,但这不管用吗?

fn extract<I, T>(row: &Row, index: I) -> anyhow::Result<T>
where
I: ColumnIndex,
T: FromValue,
{
row.get_opt(index).ok_or(ValueAlreadyTakenErrorOrSomething)?
}

最新更新