为柴油模型定义结构时出现错误未定义类型或模块
Getting error undefined type or module when defining struct for diesel models
我无法在 Rust 上为 运行 提供柴油。本项目的背景是一个计分系统,使用postgres作为服务器保存计分,diesel访问postgres。当我在 models.rs 中定义一个结构(名为 Score
)时,我得到这个错误:
error[E0433]: failed to resolve: use of undeclared type or module `scores`
--> src/models.rs:7:16
|
7 | #[table_name = "scores"]
| ^^^^^^^^ use of undeclared type or module `scores`
schema.rs的内容是:
table! {
scores (name) {
name -> Varchar,
points -> Nullable<Int4>,
subject -> Nullable<Varchar>,
}
}
这是我的 models.rs:
#[macro_use]
use diesel::*;
use diesel::sql_types::*;
use crate::schema::scores::*;
#[derive(Queryable, Insertable, QueryableByName)]
#[table_name = "scores"]
pub struct Score {
#[sql_type = "Varchar"]
name: String,
#[sql_type = "Integer"]
points: Option<i32>,
#[sql_type = "Varchar"]
subject: Option<String>,
}
我正在尝试使用 add_entry.rs:
添加条目
use super::models::Score;
use diesel::pg::PgConnection;
use crate::schema::*;
pub fn create_score(conn: PgConnection, name: String, score: i32, subject: String) -> () {
let new_score = Score {
name: name,
points: Some(score),
subject: Some(subject),
};
let ins = diesel::insert_into(scores::table)
.values(new_score)
.execute(&conn);
}
在main.rs中,我有:
#[macro_use] extern crate diesel;
mod add_entry;
mod connect;
mod models;
mod schema;
use diesel::dsl::sql_query;
fn main() {
let conn = connect::connect();
let name = String::from("name");
let subject = String::from("subject");
add_entry::create_score(conn, name.clone(), 75, subject.clone());
//random data
list_score();
}
fn list_score() {
let connection = connect::connect();
let result = sql_query("SELECT * FROM scores");
println!("{:#?}", result);
}
在connect.rs(连接服务器)中我有:
use dotenv::dotenv;
use diesel::pg::PgConnection;
use diesel::prelude::*;
use std::env;
pub fn connect() -> PgConnection {
dotenv().ok();
let database_url = env::var("DATABASE_URL")
.expect("Cannot get DB URL.");
PgConnection::establish(&database_url)
.expect(&format!("Error connecting to {}", database_url));
}
我的Cargo.toml依赖部分的内容是
dotenv = "0.9.0"
diesel = { git = "https://github.com/diesel-rs/diesel", features = ["postgres"] }
为了得到这个错误,我 运行 diesel setup
设置了所有内容,diesel migration run
、diesel migration redo
、diesel migration run
,最后 cargo build
.
我的完整代码可以在这个 repository.
中找到
我应该怎么做才能消除这个错误?
谢谢。
如果您的模式包含可为空的字段,您需要在 Rust 端为此类字段使用 Option<T>
:
#[macro_use]
use diesel::*;
use crate::schema::scores;
#[derive(Queryable, Insertable)]
//#[table_name = "scores"]
pub struct Score {
//#[sql_type = "Varchar"]
pub name: String,
//#[sql_type = "Integer"]
pub points: Option<i32>,
//#[sql_type = "Varchar"]
pub subject: Option<String>,
//#[sql_type = "Varchar"]
pub date: Option<String>,
}
并且在使用diesel::insert_into
的时候记得导入schema::scores
.
add_entry.rs
:
use super::models::Score;
use crate::schema::scores;
use diesel::pg::PgConnection;
use diesel::prelude::*;
pub fn create_score(
conn: PgConnection,
name: String,
score: i32,
subject: String,
date: String,
) -> () {
let new_score = Score {
name: name,
points: Some(score),
subject: Some(subject),
date: Some(date),
};
let ins = diesel::insert_into(scores::table)
.values(new_score)
.execute(&conn);
}
如果您解决了使用移动值到 main.rs
中引起的问题,您现在可以编译您的项目。
add_entry::create_score(
connection,
option.clone(),
scores,
subject.clone(),
date.clone(),
);
简答:您需要导入 use crate::schema::scores;
而不是 use crate::schema::scores::*;
。
更长的解释:
Diesel 的 table!
宏生成了一个相当复杂的模块结构,包含多种类型。此外,这些类型是从不同位置重新导出的,例如 dsl
模块。 derive 需要知道 crate::schema::your_table::table
类型和每列的所有类型(因此 crate::schema::your_table::column_a
,...)。由于它无法访问整个模块并且不知道范围内的类型是什么,diesel 需要以某种方式推断出该类型。最简单的方法是从某处获取模块名称。这是通过 #[table_name = "your_table"]
属性完成的,该属性假定模块 your_table
在包含 table 和列的相应类型的范围内。
有关更多详细信息,请查看以下文档:
我无法在 Rust 上为 运行 提供柴油。本项目的背景是一个计分系统,使用postgres作为服务器保存计分,diesel访问postgres。当我在 models.rs 中定义一个结构(名为 Score
)时,我得到这个错误:
error[E0433]: failed to resolve: use of undeclared type or module `scores`
--> src/models.rs:7:16
|
7 | #[table_name = "scores"]
| ^^^^^^^^ use of undeclared type or module `scores`
schema.rs的内容是:
table! {
scores (name) {
name -> Varchar,
points -> Nullable<Int4>,
subject -> Nullable<Varchar>,
}
}
这是我的 models.rs:
#[macro_use]
use diesel::*;
use diesel::sql_types::*;
use crate::schema::scores::*;
#[derive(Queryable, Insertable, QueryableByName)]
#[table_name = "scores"]
pub struct Score {
#[sql_type = "Varchar"]
name: String,
#[sql_type = "Integer"]
points: Option<i32>,
#[sql_type = "Varchar"]
subject: Option<String>,
}
我正在尝试使用 add_entry.rs:
添加条目use super::models::Score;
use diesel::pg::PgConnection;
use crate::schema::*;
pub fn create_score(conn: PgConnection, name: String, score: i32, subject: String) -> () {
let new_score = Score {
name: name,
points: Some(score),
subject: Some(subject),
};
let ins = diesel::insert_into(scores::table)
.values(new_score)
.execute(&conn);
}
在main.rs中,我有:
#[macro_use] extern crate diesel;
mod add_entry;
mod connect;
mod models;
mod schema;
use diesel::dsl::sql_query;
fn main() {
let conn = connect::connect();
let name = String::from("name");
let subject = String::from("subject");
add_entry::create_score(conn, name.clone(), 75, subject.clone());
//random data
list_score();
}
fn list_score() {
let connection = connect::connect();
let result = sql_query("SELECT * FROM scores");
println!("{:#?}", result);
}
在connect.rs(连接服务器)中我有:
use dotenv::dotenv;
use diesel::pg::PgConnection;
use diesel::prelude::*;
use std::env;
pub fn connect() -> PgConnection {
dotenv().ok();
let database_url = env::var("DATABASE_URL")
.expect("Cannot get DB URL.");
PgConnection::establish(&database_url)
.expect(&format!("Error connecting to {}", database_url));
}
我的Cargo.toml依赖部分的内容是
dotenv = "0.9.0"
diesel = { git = "https://github.com/diesel-rs/diesel", features = ["postgres"] }
为了得到这个错误,我 运行 diesel setup
设置了所有内容,diesel migration run
、diesel migration redo
、diesel migration run
,最后 cargo build
.
我的完整代码可以在这个 repository.
中找到我应该怎么做才能消除这个错误? 谢谢。
如果您的模式包含可为空的字段,您需要在 Rust 端为此类字段使用 Option<T>
:
#[macro_use]
use diesel::*;
use crate::schema::scores;
#[derive(Queryable, Insertable)]
//#[table_name = "scores"]
pub struct Score {
//#[sql_type = "Varchar"]
pub name: String,
//#[sql_type = "Integer"]
pub points: Option<i32>,
//#[sql_type = "Varchar"]
pub subject: Option<String>,
//#[sql_type = "Varchar"]
pub date: Option<String>,
}
并且在使用diesel::insert_into
的时候记得导入schema::scores
.
add_entry.rs
:
use super::models::Score;
use crate::schema::scores;
use diesel::pg::PgConnection;
use diesel::prelude::*;
pub fn create_score(
conn: PgConnection,
name: String,
score: i32,
subject: String,
date: String,
) -> () {
let new_score = Score {
name: name,
points: Some(score),
subject: Some(subject),
date: Some(date),
};
let ins = diesel::insert_into(scores::table)
.values(new_score)
.execute(&conn);
}
如果您解决了使用移动值到 main.rs
中引起的问题,您现在可以编译您的项目。
add_entry::create_score(
connection,
option.clone(),
scores,
subject.clone(),
date.clone(),
);
简答:您需要导入 use crate::schema::scores;
而不是 use crate::schema::scores::*;
。
更长的解释:
Diesel 的 table!
宏生成了一个相当复杂的模块结构,包含多种类型。此外,这些类型是从不同位置重新导出的,例如 dsl
模块。 derive 需要知道 crate::schema::your_table::table
类型和每列的所有类型(因此 crate::schema::your_table::column_a
,...)。由于它无法访问整个模块并且不知道范围内的类型是什么,diesel 需要以某种方式推断出该类型。最简单的方法是从某处获取模块名称。这是通过 #[table_name = "your_table"]
属性完成的,该属性假定模块 your_table
在包含 table 和列的相应类型的范围内。
有关更多详细信息,请查看以下文档: