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