"use of undeclared type or module" when using Diesel's `belongs_to` attribute

13,453

As the error mentions, birds is not in scope. The table! macro creates a public module (birds), which you then need to bring into scope to be able to derive Associations (in models.rs):

use super::schema::birds;

See diesel::associations for an example, where it shows that one needs to use the schema for derive.

Share:
13,453

Related videos on Youtube

crash springfield
Author by

crash springfield

Updated on September 15, 2022

Comments

  • crash springfield
    crash springfield over 1 year

    I'm loosely following Diesel's getting started guide trying to set up a relational database, but getting the following error on compile:

    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`.
    
    

    Here's the binary:

    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);
        }
    }
    

    and lib.rs (imported as 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
    }
    

    and the schema.rs generated by Diesel

    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,
    );
    

    The only issue I could find related to this says I need to have birds in scope and references the table! macro that I have provided, so I'm not sure what's missing.

    When I comment out everything related to the birds database, everything runs as expected.

    Full project with Cargo.toml for reference: https://github.com/crashspringfield/prrr_gql/tree/diesel-error

    • Shepmaster
      Shepmaster almost 5 years
      That's great! That means that you are finding more details about the problem that you can update the question with. For example, you now know that belongs_to is responsible, so that can be part of your question title. I've updated that to show an example of how you can improve your question.
    • Shepmaster
      Shepmaster almost 5 years
      Next, take smaller steps to reduce the problem. When the problem goes away, undo that change and try removing / changing other things. It's highly likely that you'll solve your own problem this way.