在当前范围内没有为 struct `schema::todos::table` 找到名为 `table` 的函数或关联项
Posted
技术标签:
【中文标题】在当前范围内没有为 struct `schema::todos::table` 找到名为 `table` 的函数或关联项【英文标题】:No function or associated item named `table` found for struct `schema::todos::table` in the current scope 【发布时间】:2021-02-19 06:30:22 【问题描述】:我想创建一个函数,使用 Diesel 读取 postgresql 中的所有数据并将其作为 Vec
返回。
错误信息
我相信这个错误信息表明todos
没有实现table
函数。我认为这不是问题,因为模型中有#[derive(Queryable)]
。
error[E0599]: no function or associated item named `table` found for struct `schema::todos::table` in the current scope
--> src/actions.rs:9:42
|
9 | let entries: Vec<TodoEntry> = todos::table.load::<TodoEntry>(&connection).expect("Error loading todos");
| ^^^^^ function or associated item not found in `schema::todos::table`
|
::: src/schema.rs:1:1
|
1 | / table!
2 | | todos (id)
3 | | id -> Int4,
4 | | body -> Text,
5 | |
6 | |
| |_- function or associated item `table` not found for this
|
= help: items from traits can only be used if the trait is in scope
= note: the following trait is implemented but not in scope; perhaps add a `use` for it:
`use crate::diesel::associations::HasTable;`
相关代码
Cargo.toml
[package]
authors = ["hogehogehoge"]
edition = "2018"
name = "todo"
version = "0.1.0"
[dependencies]
actix-web = "3"
askama = "*"
thiserror = "*"
diesel = version = "1.4.4", features = ["postgres", "r2d2"]
r2d2 = "0.8"
dotenv = "0.15.0"
diesel.toml
[print_schema]
file = "src/schema.rs"
actions.rs
这个文件有一个函数,它将数据库中注册的数据作为Vec
返回。
use diesel::pg::PgConnection;
use crate::models;
use crate::templates::TodoEntry;
pub fn return_all(connection: &PgConnection) -> Result<Vec<TodoEntry>, diesel::result::Error>
use crate::schema::todos::dsl::*;
let entries: Vec<TodoEntry> = todos::table.load::<TodoEntry>(&connection).expect("Error loading todos");
Ok(entries)
templates.rs
这个文件确定要在db中注册的数据类型,然后添加
#[derive(Queryable)]
pub struct Todo
pub id: u32,
pub text: String,
schema.rs
table!
todos (id)
id -> Int4,
body -> Text,
【问题讨论】:
我高度怀疑您的表未命名为table
。此外,您需要模型上的#[table_name = "tablename"]
属性。
试试todos.load(...)
【参考方案1】:
我认为您混淆了两种不同的方式来引用特定表。根据corresponding guide,它要么是crate::schema::table_name::table
,要么是crate::schema::table_name::dsl::table_name
。你尝试使用crate::schema::table_name::dsl::table_name::table
。
【讨论】:
以上是关于在当前范围内没有为 struct `schema::todos::table` 找到名为 `table` 的函数或关联项的主要内容,如果未能解决你的问题,请参考以下文章
<Struct> 没有实现特征 `diesel::Insertable<schema::trd::table>`