Rust使用Diesel查询PostgreSQL时&i64未实现Queryable<BigInt>如何解决
问题修复方案
错误原因
你遇到的编译错误核心原因是:用于查询映射的Songs结构体所有字段都定义为了借用类型(带&'a生命周期标注的引用),而Diesel的load方法执行数据库查询时,需要构造持有自身数据所有权的结构体实例——查询返回的数据库数据是新生成的值,没有现成的所有者供你借用,因此引用类型无法满足Queryable trait的约束。
此外你建表语句中多个字段允许为NULL,原结构体字段没有用Option包裹,后续运行时遇到NULL值也会触发错误。
具体修复步骤
修改Songs结构体,删除生命周期标注,将所有引用类型替换为自有类型,同时给允许为NULL的字段加上Option包裹:
#[derive(Insertable, Serialize, Queryable)] #[table_name="songs"] pub struct Songs { pub id: i64, pub name: String, pub artists: String, pub album_id: i64, // 对应数据库允许NULL的字段用Option包裹 pub publishtime: Option<i64>, pub status: i32, pub duration: Option<i32>, pub source_id: String, pub source: i32, pub created_time: Option<i64>, pub updated_time: Option<i64> }
如果后续你需要做插入操作想要避免字符串拷贝,可以单独定义一个带引用的插入专用结构体,不要和查询映射的结构体混用:
#[derive(Insertable)] #[table_name="songs"] pub struct InsertSong<'a> { pub name: &'a str, pub artists: &'a str, pub album_id: i64, pub publishtime: Option<i64>, pub status: i32, pub duration: Option<i32>, pub source_id: &'a str, pub source: i32, pub created_time: Option<i64>, pub updated_time: Option<i64> }
修改完成后重新编译即可解决当前的trait不满足错误。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

