#diesel #proc-macro #operations #generate #function #ease

diesel-ease

这是一个生成用于柴油数据库操作的某些有用函数的 proc 宏。

1 个不稳定版本

0.1.0 2022年5月28日

#2734数据库接口

MIT/Apache

24KB
226

Diesel Ease

这是一个 proc 宏,它将为使用 diesel 的数据库操作生成一些有用的函数。

此包是为那些使用 diesel 进行数据库操作并希望有更少的样板代码的人设计的。

此包将根据您的结构和结构字段生成函数。

您可以通过打开包的文档来查看生成的函数。运行 cargo doc --open 来查看文档。

安装

[dependencies]
diesel_ease = "0.1"

用法

假设您在 src/models.rs 文件中有一个名为 UserNewUser 的结构体

#[derive(Insertable)]
#[table_name = "users"]
pub struct NewUser {
    pub name: String,
}

#[diesel_ease(PgConnection)] // here we used the macro
#[derive(Queryable, Clone, Debug, PartialEq)]
pub struct User {
    pub id: i32,
    pub name: String,
}

假设您数据库中有一个名为 users 的表,并且在您的 src/schema.rs 文件中也有

table! {
    users (id) {
        id -> Int4,
        name -> Varchar,
    }
}

现在您可以通过使用 diesel_ease proc 宏获得以下相关函数

  • delete_by_id
  • delete_by_name
  • get_by_id
  • get_by_name
  • insert
  • get_ids_by_name
  • get_names_by_id
  • update_ids_by_name
  • update_names_by_id
  • get_all
  • delete_all

注意:您将获得多少函数以及您将获得哪些函数取决于您的结构

您可以使用这些方法如下

// connection to your database
let connection = establish_connection();

// get the names of the User whose id is 18
let name: String = User::get_names_by_id(&connection, 18).unwrap()[0].clone();

// update the name of the user whose id is 18
let updated_name: String = User::update_names_by_id(&connection, 18, format!("{}-2", name))
    .unwrap()
    .name;

assert_ne!(name, updated_name);

// delete the user whose id is 18
User::delete_by_id(&connection, 18).unwrap();

// Now again get the names of the User whose id is 18
let name: Vec<String> = User::get_names_by_id(&connection, 18).unwrap();

assert_eq!(name.len(), 0);

// insert a new user
let new_user = NewUser {
    name: "Mostofa".to_string(),
};

let inserted_user: User = User::insert(&connection, new_user).unwrap();

assert_eq!(&inserted_user.name, "Mostofa");

一些重要提示

  • 您的模式必须与您的模型/结构体同名。

    它必须小写,并且必须在末尾有 s

    例如,如果您在 src/models.rs 中有一个名为 User 的结构体,那么您必须在 src/schema.rs 文件中有一个名为 users 的模式。

  • 您的模型必须在 crate::models 中,并且您的模式必须在 crate::schema 中。

    例如,您的结构体可以是 crate::models::User,因此您的模式必须是 crate::schema::users

  • 必须有一个用于插入值的模型结构体 New{Model}

    例如,如果你在 src/models.rs 中有结构体 User,那么你必须在 src/models.rs 中有结构体 NewUser

  • 你需要将数据库连接结构体传递给宏。它可以是以下之一

    • diesel::mysql::MysqlConnection
    • diesel::pg::PgConnection
    • diesel::sqlite::SqliteConnection

    无论你传递什么给宏,你都需要在 src/models.rs 文件中导入它。

  • 你无法在你的结构体中使用引用。例如,以下结构体将无法工作

      struct User<'a> {
          id: i32,
          name: &'a str,
      }
    

    将不会工作

依赖

~1.5MB
~35K SLoC