Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/lgug2z/diesel-autoincrement-new-struct

Generate NewStructs for all your tables with autoincrementing IDs
https://github.com/lgug2z/diesel-autoincrement-new-struct

database-schema diesel-rs orm rust

Last synced: about 2 hours ago
JSON representation

Generate NewStructs for all your tables with autoincrementing IDs

Awesome Lists containing this project

README

        

# diesel-autoincrement-new-struct

Stop copying and pasting structs with the `id` field removed just so you can
insert objects into tables with autoincrementing primary keys.

## Motivation

I mean really, who wants to do all that copying and pasting? Who wants to keep
attributes and documentation in sync between two otherwise identical structs?

This whole idea came about after finding the excellent
[`macro_rules_attribute`](https://github.com/danielhenrymantilla/macro_rules_attribute-rs)
crate by [Daniel Henry-Mantilla](https://github.com/danielhenrymantilla),
aka my personal Rust macro hero.

## Example

```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
}
```

## Notes

- This crate doesn't re-export [Diesel](https://github.com/diesel-rs/diesel), so make sure you have `use diesel::prelude::*;` or `use diesel::Insertable;` in whichever files you use this macro
- This crate requires at least whichever version or revision of Diesel where the `#[diesel(table_name = ...)]` attribute stopped taking a double quoted string

The `#[apply]` attribute should always be the topmost attribute above a struct,
unless the struct that you want to use it on is also deriving `Identifiable`.
If that is the case, you should have that derive been the topmost attribute
above the struct so that it is excluded when generating the `NewStruct`, becuase
obviously, without an `id`, it won't be `Identifiable`:

```rust
#[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
}
```