小编cod*_*arm的帖子

为泛型类型编写 Diesel CRUD 操作

我正在尝试编写一个 Rust 箱,在使用Diesel创建简单的 CRUD 操作时,它会从用户那里删除一些样板代码

例如,如果您有Insertable一辆像这样的柴油机:

#[derive(Insertable)]
#[table_name = "users"]
pub struct UserCreate<'a> {
    pub email: String,
    pub hash: &'a [u8],
    pub first_name: Option<String>,
    pub family_name: Option<String>,
}
Run Code Online (Sandbox Code Playgroud)

我希望板条箱用户只需编写create<UserCreate>(model, pool), 将结构字段插入到数据库行中。

为此,我编写了以下函数签名(例如,简化的):

fn create<'a, C: 'a>(model: C, pool: DBPool)
where
    C: diesel::Identifiable,
    &'a C: diesel::Insertable<C::Table>,
{
    let conn = pool.get().unwrap();
    diesel::insert_into(C::table())
        .values(&model)
        .execute(&conn);
}
Run Code Online (Sandbox Code Playgroud)

问题是编译器抱怨 和Cat&C缺少一些特征边界.execute(&conn)缺少一些特征边界,我不太确定如何将它们放入子句中where,可能还有一种我不知道的更简单的方法。任何提示都非常受欢迎!

编译器输出:

error[E0277]: the trait bound `<<C as diesel::associations::HasTable>::Table as diesel::QuerySource>::FromClause: diesel::query_builder::QueryFragment<_>` …
Run Code Online (Sandbox Code Playgroud)

crud rust rust-diesel

4
推荐指数
1
解决办法
1519
查看次数

用 const 泛型表达式满足特征绑定,可能吗?

我正在尝试利用当前不稳定的功能,generic_const_exprs让我的库的用户知道他们生成的类型的结果尺寸。

我的用例要复杂得多,但我创建了一个带有可重现错误的最小示例。主要思想是,给定 aTensor<N>作为输入,我想输出 a Tensor<M>,其中M{N + 1}。A是一个特质,它同时为和 forTensor<N>实现。这是代码:Constant<N>Variable<M>

#![allow(incomplete_features)]
#![feature(generic_const_exprs)]

struct Variable<const N: usize>;
struct Constant<const N: usize>;

trait Tensor<const N: usize> {
    fn get_dim(&self) -> usize {
        N
    }
}
trait ConvertTo<Y> {
    fn convert(&self) -> Y;
}

impl<const N: usize> Tensor<N> for Variable<N> {}
impl<const N: usize> Tensor<N> for Constant<N> {}

impl<const N: usize, const M: usize> ConvertTo<Constant<M>> for Variable<N> {
    fn convert(&self) -> Constant<M> …
Run Code Online (Sandbox Code Playgroud)

generics traits rust const-generics

3
推荐指数
1
解决办法
1981
查看次数

标签 统计

rust ×2

const-generics ×1

crud ×1

generics ×1

rust-diesel ×1

traits ×1