2个版本
0.1.1 | 2022年8月7日 |
---|---|
0.1.0 | 2022年8月7日 |
在数据库接口中排名2616
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