secra-orm

Crates.iosecra-orm
lib.rssecra-orm
version0.1.2
created_at2025-12-29 18:19:12.364921+00
updated_at2025-12-29 18:21:25.557836+00
description一个 Rust 过程宏库,用于自动生成数据库模型相关的代码,简化数据库操作代码的编写
homepage
repository
max_upload_size
id2011076
size23,191
(BadassFree)

documentation

README

secra-orm

一个 Rust 过程宏库,用于自动生成数据库模型相关的代码,简化数据库操作代码的编写。

功能特性

  • 🚀 自动生成表名常量:从表名自动生成模块和常量
  • 📝 自动生成列名常量:从结构体字段自动生成列名常量
  • 🔄 自动实现 Model trait:自动为结构体实现 Model trait
  • 🎯 智能模块命名:自动从表名推断模块名(支持 va_ 前缀处理)
  • 🐍 自动格式转换:字段名自动转换为 snake_case 格式的列名
  • 📦 PascalCase 常量名:生成符合 Rust 命名规范的常量名

安装

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,
}

生成的代码

宏会自动生成以下内容:

  1. 原始结构体:保持你定义的结构体不变
  2. Model trait 实现:自动实现 crate::database::Model trait
  3. 模块:自动生成一个模块(模块名从表名推断)
    • 如果表名以 va_ 开头,则去掉前缀作为模块名
    • 例如:va_admin_company -> admin_company 模块
  4. Table 常量:模块内提供 Table 常量,值为表名字符串
  5. Columns 结构体:模块内提供 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"

详细示例

示例 1:基本结构体

#[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"

示例 2:带前缀的表名

#[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"

示例 3:不带前缀的表名

#[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_idAdminId
  • company_nameCompanyName
  • statusStatus

限制和注意事项

  1. 只能用于具名字段的结构体:不支持元组结构体或单元结构体
  2. 表名参数是必需的:必须提供 table_name 参数
  3. 参数格式:参数必须是 table_name = "表名" 的格式
  4. 依赖关系:需要你的项目中有 crate::database::Modelcrate::database::Tablecrate::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!

相关链接

Commit count: 0

cargo fmt