#diesel #macro-rules #orm #macro

diesel-autoincrement-new-struct

为所有具有自增ID的表生成新的结构体

2个版本

0.1.1 2022年8月7日
0.1.0 2022年8月7日

数据库接口中排名2616

MIT许可证

10KB
91

diesel-autoincrement-new-struct

停止复制和粘贴结构体,只是为了从移除id字段,以便可以将对象插入具有自增主键的表。

动机

我真的不明白,谁愿意做所有这些复制和粘贴的工作?谁愿意在两个本质上相同的结构体之间保持属性和文档的一致性?

这个想法是在找到Daniel Henry-Mantilla的出色的macro_rules_attribute crate之后产生的,他是我的个人Rust宏英雄。

示例

#[macro_use]
extern crate diesel_autoincrement_new_struct;

// Alternatively, you can either import the prelude where needed:
//
// use diesel_increment_new_struct::prelude::*;
//
// Or even import apply and NewInsertable individually:
//
// use diesel_increment_new_struct::apply;
// use diesel_increment_new_struct::NewInsertable;

use diesel::prelude::*;

table! {
    users(id) {
        id -> Integer,
        name -> Text,
    }
}

#[apply(NewInsertable!)]
#[derive(Debug, Clone, Queryable, AsChangeset)]
#[diesel(table_name = users)]
/// This is a user
pub struct User {
    /// This is the ID of the user
    id: i32,
    /// This is the name of the user
    name: String
}

// The code below gets generated by `#[apply(NewInsertable!)]`

#[derive(Debug, Clone, Queryable, AsChangeset)]
#[derive(Insertable)]
#[diesel(table_name = users)]
/// This is a user
pub struct NewUser {
    /// This is the name of the user
    name: String
}

注释

  • 这个crate没有重新导出Diesel,所以请确保在你的文件中使用此宏时,有use diesel::prelude::*;use diesel::Insertable;
  • 这个crate需要至少Diesel的哪个版本或修订版,其中#[diesel(table_name = ...)]属性不再接受双引号字符串

#[apply]属性应该是结构体上面的最顶层属性,除非你想要使用的结构体也派生了Identifiable。如果是这种情况,你应该将这个派生作为结构体上面的最顶层属性,以便在生成NewStruct时将其排除,因为显然,没有id,它就不会是Identifiable

#[derive(Identifiable)]
#[apply(NewInsertable!)]
#[derive(Debug, Clone, Queryable, AsChangeset)]
#[diesel(table_name = users)]
/// This is a user
pub struct User {
    /// This is the ID of the user
    id: i32,
    /// This is the name of the user
    name: String
}

依赖

~35KB