10个版本
0.2.1 | 2024年1月2日 |
---|---|
0.2.0 | 2024年1月2日 |
0.1.0 | 2022年7月19日 |
0.0.6 | 2022年7月18日 |
0.0.4 | 2021年7月31日 |
#1574 在 数据库接口
316 每月下载量
19KB
340 行
此crate允许用户使用Rust枚举在数据库中表示状态。这是通过proc宏实现的。首先,宏查看您选择的 sql_type
,然后它设计一个相应的Rust类型。映射如下
SQL | Rust |
---|---|
SmallInt |
i16 |
Integer |
i32 |
Int |
i32 |
BigInt |
i64 |
VarChar |
String |
Text |
String |
然后宏生成三个impl:一个 FromSql
impl,一个 ToSql
impl和一个 TryFrom
impl,允许在Sql类型和枚举之间进行转换(FromSql 和
ToSql
),以及从Rust类型到枚举的转换(TryInto
)。
用法
use diesel_enum::DbEnum;
use diesel::{deserialize::FromSqlRow, sql_types::{SmallInt, VarChar}};
#[derive(Debug, thiserror::Error)]
#[error("CustomError: {msg}, {status}")]
pub struct CustomError {
msg: String,
status: u16,
}
impl CustomError {
fn not_found(msg: String) -> Self {
Self {
msg,
status: 404,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, AsExpression, FromSqlRow, DbEnum)]
#[diesel(sql_type = SmallInt)]
#[diesel_enum(error_fn = CustomError::not_found)]
#[diesel_enum(error_type = CustomError)]
pub enum Status {
/// Will be represented as 0.
Ready,
/// Will be represented as 1.
Pending,
}
或者,您可以使用字符串,这将被转换为小写。例如,Status::Ready
将存储为 "ready"
在数据库中)
#[derive(Debug, Clone, Copy, PartialEq, Eq, AsExpression, FromSqlRow, DbEnum)]
#[diesel(sql_type = VarChar)]
#[diesel_enum(error_fn = CustomError::not_found)]
#[diesel_enum(error_type = CustomError)]
pub enum Status {
/// Will be represented as `"ready"`.
Ready,
/// Will be represented as `"pending"`.
Pending,
}
另一种选择是手动覆盖每个或某些变体的值。这是使用 val
属性完成的
#[derive(Debug, Clone, Copy, PartialEq, Eq, AsExpression, FromSqlRow, DbEnum)]
#[diesel(sql_type = VarChar)]
#[diesel_enum(error_fn = CustomError::not_found)]
#[diesel_enum(error_type = CustomError)]
pub enum Status {
/// Will be represented as `"reddy"`.
#[val = "reddy"]
Ready,
/// Will be represented as `"pending"`.
Pending,
}
依赖项
~1.5MB
~35K SLoC