1 个不稳定版本
0.1.0 | 2022年5月28日 |
---|
#2734 在 数据库接口
24KB
226 行
Diesel Ease
这是一个 proc 宏,它将为使用 diesel 的数据库操作生成一些有用的函数。
此包是为那些使用 diesel 进行数据库操作并希望有更少的样板代码的人设计的。
此包将根据您的结构和结构字段生成函数。
您可以通过打开包的文档来查看生成的函数。运行 cargo doc --open
来查看文档。
安装
[dependencies]
diesel_ease = "0.1"
用法
假设您在 src/models.rs
文件中有一个名为 User
和 NewUser
的结构体
#[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