Rust使用Diesel作为ORM时出现E0433未声明dict模块错误如何解决?
错误原因
- 核心错误:
#[table_name = "dict"]属性需要schema中自动生成的dict模块处于作用域内,你的models.rs没有导入该模块,导致编译器无法识别dict标识。 - 隐性问题1:你可能将schema定义文件的文件名拼写错误为
scheme.rs,Diesel默认生成的schema文件名为schema.rs,文件名错误会导致mod schema;导入失败。 - 隐性问题2:结构体字段类型与schema定义不匹配、字段顺序不一致,会导致后续编译仍然报错:
- schema中
id字段类型为Int4(对应Rust的i32),你的结构体中声明为i64 - schema中除id外所有字段均为
Nullable类型,你的结构体中对应字段声明为不可空类型 - schema中
collins、oxford字段为Int4类型,你的结构体中声明为String - 结构体字段顺序和schema中定义的顺序不一致,
Queryable派生要求字段顺序严格对应schema的定义顺序
- schema中
修复步骤
- 修正schema文件名:如果你的schema定义文件确实命名为
scheme.rs,先将文件名改为schema.rs - 调整
models.rs代码,导入dict模块、修正字段类型和顺序:
use rocket::serde::Serialize; use rocket::serde::Deserialize; // 导入schema下的dict模块 use crate::schema::dict; #[derive(Insertable, Serialize, Queryable, Deserialize, Default)] #[table_name = "dict"] pub struct QueryEdict { // 字段顺序严格和schema定义保持一致,可空字段包Option,类型匹配schema pub word: Option<String>, pub phonetic: Option<String>, pub definition: Option<String>, pub translation: Option<String>, pub pos: Option<String>, pub collins: Option<i32>, pub oxford: Option<i32>, pub tag: Option<String>, pub bnc: Option<i32>, pub frq: Option<i32>, pub exchange: Option<String>, pub detail: Option<String>, pub audio: Option<String>, pub id: i32, }
- 如果你的表实际字段都是非空约束,你可以重新生成schema:在项目根目录的
diesel.toml中配置print_schema = { nullable = false },再重新运行diesel print-schema > src/schema.rs生成非空的schema定义,就不需要在结构体中用Option包裹字段。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

