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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:45:00