#diesel #generation #database-schema #codegen #crud #database

bin+lib dsync

Generate rust structs & query functions from diesel schema files

16 releases

0.0.17 Sep 4, 2023
0.0.17-beta Sep 29, 2023
0.0.16 Aug 20, 2023
0.0.14 Jul 15, 2023
0.0.3 Oct 28, 2022

#59 in FFI

Download history 21/week @ 2023-12-18 8/week @ 2023-12-25 28/week @ 2024-01-01 21/week @ 2024-01-08 24/week @ 2024-01-15 52/week @ 2024-01-22 65/week @ 2024-01-29 32/week @ 2024-02-05 3/week @ 2024-02-12 91/week @ 2024-02-19 68/week @ 2024-02-26 54/week @ 2024-03-04 66/week @ 2024-03-11 23/week @ 2024-03-18 32/week @ 2024-03-25 103/week @ 2024-04-01

232 downloads per month

MIT/Apache

105KB
2.5K SLoC

dsync

License: MIT OR Apache-2.0

A utility to generate database structs and querying code from diesel schema files. Primarily built for create-rust-app.

Currently, it's more advantageous to generate code over deriving code with macros because intellisense and autocompletion isn't quite there when it comes to macro expansion.

Demo

Given the following schema:

// schema.rs
diesel::table! {
    todos (id) {
        id -> Int4,
        text -> Text,
        completed -> Bool,
    }
}

We run:

cargo dsync -i schema.rs -o models

Now we have everything we need!

use models::todos;

async fn demo(db: Connection) {
  let created_todo = todos::create(&mut db, todos::CreateTodo {
    text: "Create a demo",
    completed: false,
  }).await?;
  
  let todos_list = todos::paginate(&mut db, 1, 10).await?;
  
  let updated_todo = todos::update(&mut db, created_todo.id, UpdateTodo {
    text: created_todo.text,
    completed: true,
  }).await?;
}

For a complete example, see test/simple_table/schema.rs which generates all the code in test/simple_schema/models.

Usage

  1. Add this crate:

    cargo add dsync
    
  2. Create a new binary in your project which uses the crate (for example, bin/dsync.rs)

    use std::{collections::HashMap, path::PathBuf};
    use dsync::{GenerationConfig, TableOptions};
    
    pub fn main() {
        let dir = env!("CARGO_MANIFEST_DIR");
    
        dsync::generate_files(
            PathBuf::from_iter([dir, "src/schema.rs"]), 
            PathBuf::from_iter([dir, "src/models"]), 
            GenerationConfig { /* ... your generation options ... */ }
        );
    }
    
  3. Create a Cargo.toml binary entry:

    [[bin]]
    name = "dsync"
    path = "bin/dsync.rs"
    
  4. Execute!

cargo run --bin dsync

Protip: to use cargo dsync, create an alias in .cargo/config:

[alias]
dsync="run --bin dsync"

Pre-built binary

Setting up a custom binary allows you to completely customize the generation; however, if complete customization isn't necessary, you can install the CLI directly (you'll have to make sure you keep it up-to-date by running this periodically):

cargo install dsync 

CLI Usage

  • -i: input argument: path to schema file
  • -o: output argument: path to directory where generated code should be written
  • -c: connection type (for example: diesel::r2d2::PooledConnection<diesel::r2d2::ConnectionManager<diesel::PgConnection>>)
  • -g: (optional) list of columns that are automatically generated by create/update triggers (for example, created_at, updated_at)
  • --tsync: (optional) adds #[tsync] attribute to generated structs (see https://github.com/Wulf/tsync)
  • --model-path: (optional) set a custom model import path, default crate::models::
  • --schema-path: (optional) set a custom schema import path, default crate::schema::
  • --no-serde: (optional) if set, does not output any serde related code
  • note: the CLI has fail-safes to prevent accidental file overwriting
dsync -i src/schema.rs -o src/models

Docs

See dsync --help for more information.

Feel free to open tickets for support or feature requests.

Development/Testing

Use ./test/test_all.sh to run tests. After running the test, there should be no unexpected changes to files in ./test (use git status and git diff to see if there were any changes).

License

This tool is distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE, LICENSE-MIT, and COPYRIGHT for details.

Dependencies

~3MB
~53K SLoC