使用 Diesel 的 `belongs_to` 属性时“使用未声明的类型或模块”
Posted
技术标签:
【中文标题】使用 Diesel 的 `belongs_to` 属性时“使用未声明的类型或模块”【英文标题】:"use of undeclared type or module" when using Diesel's `belongs_to` attribute 【发布时间】:2019-11-13 03:16:49 【问题描述】:我大致按照 Diesel 的 getting started 指南尝试设置关系数据库,但在编译时出现以下错误:
error[E0433]: failed to resolve: use of undeclared type or module `birds`
--> src/models.rs:9:12
|
9 | pub struct Bird
| ^^^^ use of undeclared type or module `birds`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0433`.
error: Could not compile `prrr_gql`.
这是二进制文件:
extern crate prrr_gql;
extern crate diesel;
use self::prrr_gql::*;
use self::models::*;
use self::diesel::prelude::*;
fn main()
use prrr_gql::schema::cats::dsl::*;
use prrr_gql::schema::birds::dsl::*;
let connection = establish_connection();
let results = cats.load::<Cat>(&connection)
.expect("Error hearding cats");
for cat in results
println!("", cat.name);
和 lib.rs(导入为 prrr_gql
)
#[macro_use]
extern crate diesel;
extern crate dotenv;
use diesel::prelude::*;
use diesel::pg::PgConnection;
use dotenv::dotenv;
use std::env;
pub mod schema;
pub mod models;
pub fn establish_connection() -> PgConnection
dotenv().ok();
let database_url = env::var("DATABASE_URL")
.expect("DATABASE_URL must be set");
PgConnection::establish(&database_url)
.expect(&format!("Error connecting to ", database_url))
models.rs
#[derive(Queryable, Debug)]
pub struct Cat
pub id: i32,
pub name: String,
#[derive(Queryable, Associations, Debug)]
#[belongs_to(Cat)]
pub struct Bird
pub id: i32,
pub cat_id: i32,
pub species: String,
pub colors: String
以及 Diesel 生成的 schema.rs
table!
birds (id)
id -> Int4,
species -> Varchar,
colors -> Varchar,
cat_id -> Nullable<Int4>,
table!
cats (id)
id -> Int4,
name -> Varchar,
joinable!(birds -> cats (cat_id));
allow_tables_to_appear_in_same_query!(
birds,
cats,
);
我能找到的唯一与此相关的issue 表示我需要在范围内拥有birds
并引用我提供的table!
宏,所以我不确定缺少什么。
当我注释掉与birds
数据库相关的所有内容时,一切都按预期运行。
带有 Cargo.toml 的完整项目供参考:https://github.com/crashspringfield/prrr_gql/tree/diesel-error
【问题讨论】:
很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在全新的 Cargo 项目中重现您的错误,然后edit 您的问题包含附加信息,这将使我们更容易为您提供帮助。您可以使用Rust- 和Diesel 特定的技巧来减少在此处发布的原始代码。谢谢! (最后一个链接应该是the tag page,哎呀!) @Shepmaster 我会审查这些并根据需要进行更新。我已经用 github 链接更新了这个问题,该链接指向一个重现错误的分支(我会保留它作为将来的参考) 太好了!这意味着您正在查找有关可以更新问题的问题的更多详细信息。例如,您现在知道belongs_to
负责,因此可以将其作为问题标题的一部分。我已对其进行了更新,以展示如何改进问题的示例。
接下来,采取更小的步骤来减少问题。当问题消失时,撤消该更改并尝试删除/更改其他内容。您很有可能通过这种方式解决自己的问题。
【参考方案1】:
正如错误所述,birds
不在范围内。 table!
宏创建一个公共模块 (birds
),然后您需要将其引入范围以便能够派生 Associations
(在 models.rs 中):
use super::schema::birds;
查看diesel::associations 的示例,它表明需要use
derive
的架构。
【讨论】:
以上是关于使用 Diesel 的 `belongs_to` 属性时“使用未声明的类型或模块”的主要内容,如果未能解决你的问题,请参考以下文章
&diesel::MysqlConnection 没有实现特征diesel::Connection