从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
相关产品推荐
相关产品推荐

