"использование необъявленного типа или модуля" при использовании атрибута Diesel ``s_to` - PullRequest
1 голос
/ 02 июля 2019

Я слабо следую руководству начала работы Дизеля, пытаясь настроить реляционную базу данных, но получая следующую ошибку при компиляции:

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))
}
* +1012 * 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
}

и schema.rs, сгенерированные 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,
);

Единственная проблема , которую я мог найти, связанная с этим, говорит, что мне нужно иметь birds в области видимости и ссылается на предоставленный мной макрос table!, так что я не уверен, чего не хватает.

Когда я закомментирую все, что связано с базой данных birds, все работает как положено.

Полный проект с Cargo.toml для справки: https://github.com/crashspringfield/prrr_gql/tree/diesel-error

1 Ответ

0 голосов
/ 02 июля 2019

Как упоминается в ошибке, birds не входит в объем.Макрос table! создает открытый модуль (birds), который затем необходимо ввести в область видимости, чтобы иметь возможность получить Associations (в models.rs):

use super::schema::birds;

См. дизель :: ассоциации для примера, где показано, что нужно use схема для derive.

...