#enums #diesel

diesel-enum

使用diesel在枚举和数据库之间进行互操作

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数据库接口

Download history 99/week @ 2024-03-13 99/week @ 2024-03-20 55/week @ 2024-03-27 102/week @ 2024-04-03 82/week @ 2024-04-10 155/week @ 2024-04-17 100/week @ 2024-04-24 34/week @ 2024-05-01 213/week @ 2024-05-08 320/week @ 2024-05-15 241/week @ 2024-05-22 104/week @ 2024-05-29 64/week @ 2024-06-05 69/week @ 2024-06-12 95/week @ 2024-06-19 52/week @ 2024-06-26

316 每月下载量

MIT 许可证

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类型和枚举之间进行转换(FromSqlToSql),以及从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