Rust无法解析从crate根目录导入,但模块与子模块可用

emeijp43  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(160)

我试图用actix和diesel创建一个基本的crud应用程序,但diesel有问题。这是项目的文件夹结构:

|─ migrations 
|─ src 
| ├─ users
| ├─mod.rs
| ├─models.rs
|─ main.rs
|─ schema.rs

字符串
其中schema.rs由diesel通过运行迁移命令创建和管理。
以下是文件及其内容:
mod.rs

pub mod models;
pub mod routes;

pub use models::*;*
pub use routes::;


models.rs

use diesel::{Insertable, Queryable};
use crate::schema::users;

#[derive(Queryable)]
pub struct User {
    pub id: i64,
    pub email: String,
    pub password_hash: String,
    pub confirmed: bool,
}

#[derive(Insertable)]
#[table_name = "users"]
pub struct NewUser {
    pub email: String,
    pub password_hash: String,
    pub confirmed: bool,
}


main.rs

#![allow(unused)]

#[macro_use]
extern crate diesel;

mod users;
mod schema;

use diesel::pg::PgConnection;
use diesel::prelude::*;
use diesel::query_dsl::methods::FindDsl;
use dotenv::dotenv;
use std::env;

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

fn main() -> std::io::Result<()> {
    let connection = establish_connection();
    use schema::users::dsl as users_dsl;

    let results = users_dsl::users.filter(users_dsl::confirmed.eq_all(true)).limit(5).load::<users::models::User>(&connection).expect("Error loading users")  ;

    for _user in results {
        println!("user id {} with mail {}", _user.id, _user.email)
    }

    Ok(())
}


schema.rs:

table! {
    users (id) {
        id -> Int8,
        email -> Varchar,
        password_hash -> Varchar,
        confirmed -> Bool,
    }
}


问题是,当我试图从crate root导入schema到user/models.rsrustc说“unresolved import crate::schema could not find schema in the crate root”,但rust-analyzer建议了该模块中存在的内容(例如表,表及其列)。
有什么问题吗?

qvtsj1bj

qvtsj1bj1#

如diesel文档中所述,将以下内容添加到lib文件中,如果lib不存在,则在main.rs的同一级别中创建 lib.rs

pub mod models;
    pub mod schema;

字符串
只有当你把它放在lib.rs文件中时,该模块才有用。
[在此输入图像描述][1] [1]:https://i.stack.imgur.com/OidR6.png
你的项目结构应该是这样的:

src/lib.rs
    src/main.rs
    src/models.rs
    src/schema.rs


当你想从其他文件导入一些东西时,使用use crate::FILENAME::{function, Object}
Diesel入门文档太棒了!请看那里,你会发现所有. https://diesel.rs/guides/getting-started

esyap4oy

esyap4oy2#

刚刚发现我必须在一个名为lib.rs的文件中导入schema模块(如果它不存在,请创建它):
网址:lib.rs

pub mod schema;

#[macro_use]
extern crate diesel;

字符串
所以它可以通过

use crate::schema::*;


请注意,macro_use需要在lib.rs中使用table!宏,才能在schema.rs中使用table!宏而不会出错。

相关问题