使用 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

使用动态参数查询 Diesel 表

如何使用 Diesel 将 i64 与 Insertable 一起使用

使用 Diesel 执行插入或更新

如何使用 Diesel 计算数组列中不同元素的数量?

如何使用 Diesel 的主键以外的列找到值?