| Crates.io | secra-orm |
| lib.rs | secra-orm |
| version | 0.1.2 |
| created_at | 2025-12-29 18:19:12.364921+00 |
| updated_at | 2025-12-29 18:21:25.557836+00 |
| description | 一个 Rust 过程宏库,用于自动生成数据库模型相关的代码,简化数据库操作代码的编写 |
| homepage | |
| repository | |
| max_upload_size | |
| id | 2011076 |
| size | 23,191 |
一个 Rust 过程宏库,用于自动生成数据库模型相关的代码,简化数据库操作代码的编写。
Model traitva_ 前缀处理)在 Cargo.toml 中添加依赖:
[dependencies]
secra-orm = { path = "../secra-orm" } # 本地路径
# 或
# secra-orm = "0.1.0" # 从 crates.io 安装
使用 #[secra_orm(table_name = "表名")] 属性宏来标记你的结构体:
use secra_orm::secra_orm;
#[secra_orm(table_name = "va_admin_company")]
pub struct Model {
pub admin_id: i64,
pub company_id: i64,
pub status: i16,
}
宏会自动生成以下内容:
crate::database::Model traitva_ 开头,则去掉前缀作为模块名va_admin_company -> admin_company 模块Table 常量,值为表名字符串Columns 结构体,包含所有字段的列名常量use admin_company;
// 访问表名(常量)
let table = admin_company::Table; // "va_admin_company"
// 访问列名(使用 PascalCase 常量名)
let admin_id_col = admin_company::Columns::AdminId; // "admin_id"
let company_id_col = admin_company::Columns::CompanyId; // "company_id"
let status_col = admin_company::Columns::Status; // "status"
// 也可以通过结构体直接访问表名
let table = Model::TABLE; // "va_admin_company"
#[secra_orm(table_name = "va_users")]
pub struct User {
pub id: i64,
pub username: String,
pub email: String,
pub created_at: i64,
}
生成的代码允许你这样使用:
use users;
// 访问表名
let table_name = users::Table; // "va_users"
// 访问列名
let id_col = users::Columns::Id; // "id"
let username_col = users::Columns::Username; // "username"
let email_col = users::Columns::Email; // "email"
let created_at_col = users::Columns::CreatedAt; // "created_at"
#[secra_orm(table_name = "va_admin_company")]
pub struct AdminCompany {
pub admin_id: i64,
pub company_id: i64,
pub status: i16,
}
由于表名以 va_ 开头,模块名会自动去掉前缀:
use admin_company; // 注意:不是 va_admin_company
let table = admin_company::Table; // "va_admin_company"
let admin_id = admin_company::Columns::AdminId; // "admin_id"
#[secra_orm(table_name = "products")]
pub struct Product {
pub id: i64,
pub name: String,
pub price: f64,
}
模块名使用完整的表名:
use products;
let table = products::Table; // "products"
let name_col = products::Columns::Name; // "name"
字段名会自动转换为 snake_case 格式作为列名:
adminId → "admin_id"AdminId → "admin_id"companyName → "company_name"status → "status"(已经是 snake_case,保持不变)列名常量使用 PascalCase 格式:
admin_id → AdminIdcompany_name → CompanyNamestatus → Statustable_name 参数table_name = "表名" 的格式crate::database::Model、crate::database::Table 和 crate::database::Columns trait 的定义如果参数格式不正确或结构体不符合要求,会在编译时产生清晰的错误信息:
// 错误:缺少参数
#[secra_orm] // ❌ 编译错误:需要 table_name 参数
// 错误:参数名错误
#[secra_orm(name = "table")] // ❌ 编译错误:期望 table_name 参数
// 错误:参数值不是字符串
#[secra_orm(table_name = 123)] // ❌ 编译错误:期望字符串字面量
// 错误:用于元组结构体
#[secra_orm(table_name = "table")]
pub struct Tuple(i64, String); // ❌ 编译错误:只能用于具名字段的结构体
查看 CHANGELOG.md 了解详细的版本变更历史。
[在此添加许可证信息]
欢迎提交 Issue 和 Pull Request!