`DbConnection` 没有实现特征`diesel::Connection`

Posted

技术标签:

【中文标题】`DbConnection` 没有实现特征`diesel::Connection`【英文标题】:The trait `diesel::Connection` is not implemented for `DbConnection` 【发布时间】:2021-04-25 08:37:04 【问题描述】:

我正在尝试将 postgres 数据库添加到使用柴油的火箭应用程序中。我的main.rs 文件看起来像这样,但在.get_result(connection) 处给出错误“diesel::Connection 的特征未针对DbConnection 实现”

#[macro_use] extern crate diesel;
extern crate dotenv;
#[macro_use] extern crate rocket;
#[macro_use] extern crate rocket_contrib;

use diesel::prelude::*;
use rocket_contrib::database;
use rocket_contrib::json::JsonValue;

mod models;
mod schema;

use self::models::*;
use self::schema::*;

#[database("my_db")]
struct DbConnection(diesel::PgConnection);

#[get("/")]
fn index(connection: DbConnection) -> JsonValue 
    json!(all_bicycles(&connection))


fn create_bicycle<'a>(connection: &DbConnection, make: &'a str, model: &'a str, rider_type: &'a str, size: &'a str) -> Bicycle 
    let new_bicycle = NewBicycle 
        make,
        model,
        rider_type,
        size
    ;

    diesel::insert_into(bicycles::table)
        .values(new_bicycle)
        // the error is on the following line, on `connection`
        .get_result(connection)
        .expect("Error saving bicycle")


fn main() 
    rocket::ignite()
        .attach(DbConnection::fairing())
        .mount("/", routes![index])
        .launch();


我的Cargo.toml(相关部分)

[dependencies]
diesel =  version = "1.4.4", features = ["postgres"] 
dotenv = "0.15.0"
rocket =  git = "https://github.com/SergioBenitez/Rocket" 
serde =  version = "1.0", features = ["derive"] 
serde_json = "1.0"

[dependencies.rocket_contrib]
git = "https://github.com/SergioBenitez/Rocket"
default-features = false
features = ["json", "diesel_postgres_pool"]

还有我的Rocket.toml

[global.databases]
my_db =  url = "postgres://postgres:@localhost/bikes" 

展开后的错误如下:

&DbConnection
the trait bound `DbConnection: diesel::Connection` is not satisfied

the trait `diesel::Connection` is not implemented for `DbConnection`

我已成功建立与数据库的连接,diesel setup 成功。我还可以添加迁移 - 尽管我认为它们对于这个问题是不必要的。

我在这里做错了什么?

编辑

我再次阅读 Rocket 文档,发现我错过了 use rocket_contrib::databases::diesel; 行,这与 extern crate diesel; 冲突,所以我将数据库逻辑移到了一个新模块 - database.rs。什么都没有真正改变,但新模块看起来像这样:

use rocket_contrib::database;
use rocket_contrib::databases::diesel;

#[database("my_db")]
pub struct DbConnection(diesel::PgConnection);

它的使用方式是这样的:

main.rs

// ...
mod database;
use self::database::DbConnection;
// ...

错误依旧。

【问题讨论】:

解决了吗?面对与火箭 0.5-rc1 完全相同的问题,我并没有得到它想要的错误 【参考方案1】:

根据rocket 文档,您需要将连接类型取消引用为实现diesel::connection::Connection 的某种类型类型,因为包装器类型没有实现必要的特征。因此,您需要将代码更改为以下内容:

    diesel::insert_into(bicycles::table)
        .values(new_bicycle)
        // the error is on the following line, on `connection`
        .get_result(&*connection)
        .expect("Error saving bicycle")

(在将连接传递给get_result 函数之前,请注意额外的&amp;*。)

【讨论】:

感谢您的回答,但很遗憾没有奏效。我还是 Rust 的新手,但我相信问题在于 #[database] 没有正确地将特征应用到结构,也就是说我不知道​​如何修复它,所以我只是在猜测。跨度> “它不起作用”并不能帮助别人理解你的问题。请准确提供您到目前为止所做的事情以及您期望发生的事情以及正在发生的事情。这包括所有潜在的错误消息等。否则其他人唯一能做的就是指向相应的文档。 @weiznich 我一直面临同样的问题,实施了您的解决方案,但它引发了不同的错误:fn create_todo(conn: DbConn) ... "Type DbConn cannot be dereferenced"。【参考方案2】:

我创建了一个 *** 帐户来回答这个问题。我得到了它的工作

connection.run(|conn| 
    diesel::insert_into(bicycles::table)
      .values(new_bicycle)
      .get_result::<Bicycle>(conn)
      .expect("Error saving bicycle")
  ).await;

我必须使 fn 异步。另外,我遇​​到了反序列化问题,但我认为这不相关。

【讨论】:

【参考方案3】:

如果我没记错的话,应该是

#[get("/")]
fn index(connection: DbConnection) -> JsonValue 
    json!(all_bicycles(&*connection))

对于路线和

fn all_bicycles(connection: &diesel::PgConnection) -> Vec<Bicycle> 
    // ...
    .get_result(connection)
    .expect("Error saving bicycle")
    // ...

为您查询数据库的实际方法。因此,直接传递实际的柴油连接作为参考(因为您的数据库抽象不一定了解火箭)。

【讨论】:

以上是关于`DbConnection` 没有实现特征`diesel::Connection`的主要内容,如果未能解决你的问题,请参考以下文章

Appsettings 上的 DbConnection 字符串问题

ruby 使用Die Class 1中的前一个Die类,实现一个新的Die类,它将一个字符串数组作为输入。当Die#roll

ruby 使用Die Class 1中的前一个Die类,实现一个新的Die类,它将一个字符串数组作为输入。当Die#roll

缺少 DbProviderFactories.GetFactory 方法 (DbConnection)

从DbConnection获取SqlConnection

为啥不用 DbConnection 而不是 SqlConnection 或 OracleConnection?