You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从SQLite行读取Vec<u8>时遇expected Error, found Infallible错误的解决方法

解决sqlite crate中Row.read读取Vec的类型不匹配错误

错误本质是Row.read方法的类型约束要求:TryFrom<&Value>的错误类型必须与方法的错误参数E一致,且E能从sqlite::Error转换。但Vec<u8>实现TryFrom<&Value>时,错误类型是Infallible(因为从Blob类型转Vec<u8>不会失败),而默认推断的E是sqlite::Error,导致类型不匹配。

方案一:显式指定错误类型为Infallible

直接指定read的第二个类型参数为Infallible,利用Result<T, Infallible>可安全转换为T的特性:

use std::convert::Infallible;
use sqlite::Row;

pub fn read_vecu8(row: &Row, col: &str) -> Vec<u8> {
    row.read::<Vec<u8>, Infallible>(col).into()
}

或者用unwrap()替代into(),效果完全一致:

use std::convert::Infallible;
use sqlite::Row;

pub fn read_vecu8(row: &Row, col: &str) -> Vec<u8> {
    row.read::<Vec<u8>, Infallible>(col).unwrap()
}

方案二:读取为&[u8]再转换为Vec

先读取为&[u8](其TryFrom<&Value>的错误类型是sqlite::Error,符合默认推断),再转换为Vec<u8>:

use sqlite::Row;

pub fn read_vecu8(row: &Row, col: &str) -> Vec<u8> {
    row.read::<&[u8], _>(col).unwrap().to_vec()
}

注意:两种方案都假设目标列确实是Blob类型,若列类型不匹配,unwrap()会触发panic。如果需要处理错误,可将函数返回值改为Result<Vec<u8>, sqlite::Error>,并使用?替代unwrap()。

内容的提问来源于stack exchange,提问作者Evan Carroll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:37:45