postgresql 将Diesel升级到v2(Rust)后无法查询

3duebb1j  于 2023-01-02  发布在  PostgreSQL
关注(0)|答案(1)|浏览(271)

获取以下错误:

error[E0308]: mismatched types
    --> src/u/r/api/products/articles.rs:17:69
     |
17   |     let query = web::block(move || articles::table.load::<Articles>(&*connection).unwrap()).await;
     |                                                    ---------------- ^^^^^^^^^^^^ types differ in mutability
     |                                                    |
     |                                                    arguments to this function are incorrect
     |
     = note: expected mutable reference `&mut _`
                        found reference `&PgConnection`
note: associated function defined here
    --> /Users/b/.cargo/registry/src/github.com/diesel-2.0.2/src/query_dsl/mod.rs:1497:8
     |
1497 |     fn load<'query, U>(self, conn: &mut Conn) -> QueryResult<Vec<U>>
     |        ^^^^

我使用的是柴油v2,它的工作之前,我升级到最新版本。
我哪里做错了?

use crate::u::db::connection::DbPool;
use actix_web::{get, web, HttpResponse, Responder};

#[get("/product/articles")]
pub async fn list(db_pool: web::Data<DbPool>) -> impl Responder {
    use crate::u::db::models::products::Articles;
    use crate::u::db::schemas::products::articles;

    let connection = db_pool.get();
    if let Err(e) = connection {
        return HttpResponse::InternalServerError().body(format!("E1-{:?}", e));
    }

    let connection = connection.unwrap();

    let query = web::block(move || articles::table.load::<Articles>(&*connection).unwrap()).await;

    if let Err(e) = query {
        return HttpResponse::InternalServerError().body(format!("E2-{:?}", e));
    }

    let q = query.expect("oops not Ok");

    HttpResponse::Ok().json(q)
}

models/products.rs

use chrono::{DateTime, Utc};
use uuid::Uuid;

use crate::u::db::schemas::products::*;

#[derive(Queryable, Debug, Identifiable, serde::Serialize, serde::Deserialize)]
#[table_name = "articles"]
#[primary_key(prod_art_pvt_uuid)]
pub struct Articles {
    pub prod_art_pvt_uuid: Uuid,
    pub prod_art_pub_uuid: Uuid,
    pub prod_article_pub_id: i32,
    pub t: DateTime<Utc>,
}

db/connection.rs

use crate::u::config;

use diesel::pg::PgConnection;
use diesel::r2d2::ConnectionManager;
use r2d2::Pool;

pub type DbPool = r2d2::Pool<ConnectionManager<PgConnection>>;

pub fn get_pool() -> DbPool {
    let url: String = config::get("database_url");

    println!("Connecting to database...");
    let manager = ConnectionManager::<PgConnection>::new(url);

    Pool::builder()
        .build(manager)
        .expect("Failed to create database connection pool.")
}
qoefvg9y

qoefvg9y1#

错误消息已经指出了需要更改的内容。重要的是:

error[E0308]: mismatched types
    --> src/u/r/api/products/articles.rs:17:69
     |
17   |     let query = web::block(move || articles::table.load::<Articles>(&*connection).unwrap()).await;
     |                                                    ---------------- ^^^^^^^^^^^^ types differ in mutability
     |                                                    |
     |                                                    arguments to this function are incorrect
     |
     = note: expected mutable reference `&mut _`
                        found reference `&PgConnection`

正如你所看到的,你需要把load函数的参数改成一个可变的引用,你试图传递一个不可变的引用,这是底层函数所不能接受的。
我建议查看Diesel Migration guide,它包含了2.0版本中大多数面向用户的突破性更改的概述。

相关问题