rust Diesel ORM查询返回类型未知

9q78igpj  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(117)

我遵循Getting Started with Diesel指南。我已经完成了它,它可以正常工作--也就是说,当我运行代码时,我得到了想要的行为。
然而,我注意到许多Diesel查询返回unknown(或者一些 Package unknown的类型),就好像Rust语言服务器没有识别模型/模式类型一样。
更具体地说,我有以下模型:

#[derive(Queryable, Selectable)]
#[diesel(table_name = posts)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct Post {
    pub id: i32,
    pub title: String,
    pub body: String,
    pub published: bool,
}

字符串
和以下模式(由Diesel CLI生成):

diesel::table! {
    posts (id) {
        id -> Int4,
        title -> Varchar,
        body -> Text,
        published -> Bool,
    }
}


除了create之外,我的所有CRUD操作都有这个问题。让我们看看select作为一个例子。
下面是通过id查询帖子的代码片段:

let post = posts // typed correctly
    .find(post_id) // '.find()' exists, but return type wrong
    .select(Post::as_select()) // language server gives up
    .first(connection)
    .optional();


以下是我的进口:

use self::models::Post;
use diesel::prelude::*;
use rust_playground::*;
use std::env::args;


表达式的返回类型是Result<Option<{unknown}>, {unknown}>。每行代码上的注解反映了类型的正确性/完整性,如嵌体类型提示所示。
正如您所看到的,posts正确地引用了模式,并且find()函数是posts的成员,但是find()调用的返回类型(<table as FindDsl<i32>>::Output)肯定是不正确的,因为它不能识别后面的select()调用。
对于其他类型的查询,我也得到了类似的行为:

let results = posts // good so far
        .filter(published.eq(true)) // fine, but return type must be wrong because...
        .limit(5) // .limit() isn't recognized
        .select(Post::as_select()) // language server gives up
        .load(connection)
        .expect("Error loading posts");
let post = diesel::update(posts.find(id)) // seems fine, but return type must be wrong
        .set(published.eq(true)) // .set() not recognized
        .returning(Post::as_returning())
        .get_result(connection)
        .unwrap();

的字符串

**在所有情况下,我希望能够链接另一个函数,如.limit(),intellisense建议只有4个函数:.as_sql().into_sql().into().try_into()。**很明显,这些函数,例如.filter()返回的是与查询数据库相关的内容,但无论出于什么原因,没有任何东西会“允许”我链调用。我把“允许”放在引号里,因为这只是一个类型问题;代码运行良好。

这是奇怪的行为,因为1)我相信我已经遵循了T的指南,2)我不明白Diesel函数如何返回不正确的类型。
我做错了什么?我如何从Diesel查询中获得完整的返回类型?

5cg8jx4n

5cg8jx4n1#

作为一个柴油机的普通用户,这就是它是如何。生 rust 分析仪与柴油机有麻烦。
我不知道这个问题是由于大量使用复杂的trait导致的类型推导,还是由于宏生成的实现。可能是两者的混合。Rust-Analyzer维护人员知道,many issues have been filed over the years解决了许多问题,但有些问题没有解决。
我唯一的“解决方案”是尝试熟悉Diesel的语法,而不依赖IDE工具,并将数据库操作封装到具有定义良好的参数和返回类型的函数中,这样{unknown}类型就不会影响您对其余代码的体验。

相关问题