data-forge

Crates.iodata-forge
lib.rsdata-forge
version0.1.0
created_at2025-09-10 11:16:32.463627+00
updated_at2025-09-10 11:16:32.463627+00
description高性能数据锻造工坊 - 为Rust开发者打造的随机数据生成与数据库填充解决方案
homepage
repositoryhttps://gitee.com/rust_us/data-forge
max_upload_size
id1832404
size790,642
fengyang (whosly)

documentation

README

DataForge

crates.io

license

Website

高性能数据锻造工坊 - 为Rust开发者打造的随机数据生成与数据库填充解决方案

📋 Prerequisites

nightly版本的Rust编译器

$ rustc --version
rustc 1.85.1 (4eb161250 2025-03-15)

✨ 特性

  • 高性能数据生成

    • 基于Rust的高性能随机数生成引擎
    • 多线程并行生成(rayon驱动)
    • 内存池优化技术
  • 数据库支持

    • 支持MySQL、PostgreSQL、SQLite数据库
    • 自动Schema推断与匹配
    • 批量插入优化
  • 丰富的数据生成器

    • 姓名生成器(中文、英文、日文)
    • 地址生成器(支持中国地区数据)
    • 网络数据生成器(邮箱、URL、IP等)
    • 日期时间生成器
    • 数字生成器(手机号、身份证等)
  • 灵活的生成方式

    • 支持正则表达式模式生成
    • 提供便捷的宏接口
    • 支持自定义生成器扩展
    • 多语言数据支持
    • 动态字段生成器类型 - 可以为每个字段指定特定的生成器类型

🚀 快速开始

安装

[dependencies]
dataforge = "0.1.0"

# 可选特性
dataforge = { version = "0.1.0", features = ["database"] }

基础使用

use dataforge::generators::*;
use dataforge::forge;
use serde_json::json;

// 生成测试用户数据
let user = forge!({
    "id" => uuid_v4(),
    "name" => name::zh_cn_fullname(),
    "age" => number::adult_age(),
    "email" => internet::email(),
    "phone" => number::phone_number_cn(),
    "address" => {
        "province" => address::zh_province(),
        "city" => regex!(r"[\u4e00-\u9fa5]{2,5}市"),
        "street" => address::zh_address()
    },
    "created_at" => datetime::iso8601()
});

println!("{}", serde_json::to_string_pretty(&user).unwrap());

使用宏生成数据

use dataforge::{regex, pattern, rand_num, datetime};

// 使用正则表达式生成
let city = regex!(r"[\u4e00-\u9fa5]{2,5}市");

// 使用模式生成
let phone = pattern!("1[3-9]\\d{9}");

// 生成随机数
let age = rand_num!(18, 65);

// 生成日期时间
let timestamp = datetime!("timestamp");
let iso_date = datetime!("iso");

核心引擎使用

use dataforge::core::{CoreEngine, GenConfig, GenerationStrategy};

let config = GenConfig {
    batch_size: 1000,
    strategy: GenerationStrategy::Random,
    null_probability: 0.05,
    ..Default::default()
};

let engine = CoreEngine::new(config);
let data = engine.generate_batch(100)?;

// 获取性能指标
let metrics = engine.metrics();
println!("Generated: {}, Errors: {}", 
    metrics.generated_count(), 
    metrics.error_count()
);

数据库填充

use dataforge::db::DatabaseForge;

// 创建数据库填充器
let forge = DatabaseForge::new("mysql://user:pass@localhost/db");

// 配置表并填充数据
let result = forge
    .table("users", 1000, |t| {
        t.field("id", || uuid_v4())
         .field("name", || name::zh_cn_fullname())
         .field("email", || internet::email())
    })
    .fill_sync()?;

println!("已填充 {} 条记录", result);

自定义生成器

use dataforge::{DataForge, Language};
use serde_json::Value;

// 创建数据生成器
let mut forge = DataForge::new(Language::ZhCN);

// 注册自定义生成器
forge.register("product_id", || {
    serde_json::json!(format!("PROD-{:06}", rand::random::<u32>() % 1000000))
});

// 使用自定义生成器
let product_id = forge.generate("product_id");

动态字段生成器类型

use dataforge::{
    db::schema::{TableSchema, DataType, FieldGeneratorType},
    filling::generators::GenericDataGenerator
};

// 创建表结构并为字段指定生成器类型
let mut schema = TableSchema::new("users".to_string());

// 添加使用默认生成器的字段(基于数据类型自动生成)
schema.add_field(
    dataforge::db::schema::FieldSchema::new(
        "id".to_string(), 
        DataType::Integer { min: Some(1), max: Some(1000000) }
    )
);

// 添加使用特定生成器类型的字段
schema.add_field(
    dataforge::db::schema::FieldSchema::new(
        "full_name".to_string(), 
        DataType::String { max_length: Some(100) }
    ).with_generator_type(FieldGeneratorType::Name)
);

schema.add_field(
    dataforge::db::schema::FieldSchema::new(
        "email".to_string(), 
        DataType::Email
    ).with_generator_type(FieldGeneratorType::RandomEmail)
);

schema.add_field(
    dataforge::db::schema::FieldSchema::new(
        "phone".to_string(), 
        DataType::Phone { country: Some("CN".to_string()) }
    ).with_generator_type(FieldGeneratorType::RandomPhone)
);

schema.add_field(
    dataforge::db::schema::FieldSchema::new(
        "company".to_string(), 
        DataType::String { max_length: Some(100) }
    ).with_generator_type(FieldGeneratorType::CompanyName)
);

schema.add_field(
    dataforge::db::schema::FieldSchema::new(
        "created_at".to_string(), 
        DataType::DateTime { format: None }
    ).with_generator_type(FieldGeneratorType::CurrentTimestamp)
);

// 生成数据
let sample_data = GenericDataGenerator::generate_data_by_schema(&schema, 5)?;

通过使用动态字段生成器类型,您可以消除硬编码的判断逻辑。系统不再需要根据表名或字段名来确定使用哪个生成函数,而是直接根据元数据信息动态生成数据。这使得数据生成更加灵活和可配置。

生成器类型

姓名生成器

  • name::zh_cn_fullname() - 中文全名
  • name::en_us_fullname() - 英文全名
  • name::ja_jp_fullname() - 日文全名

地址生成器

  • address::zh_province() - 中国省份
  • address::zh_address() - 中国地址
  • address::us_state() - 美国州名
  • address::us_city() - 美国城市

网络数据生成器

  • internet::email() - 邮箱地址
  • internet::url() - 网站URL
  • internet::ip_address() - IP地址
  • internet::mac_address() - MAC地址
  • internet::user_agent() - 用户代理字符串

数字生成器

  • number::phone_number_cn() - 中国手机号
  • number::id_card_cn() - 中国身份证号
  • number::credit_card_number() - 银行卡号
  • number::adult_age() - 成人年龄
  • number::currency(min, max) - 货币金额

日期时间生成器

  • datetime::iso8601() - ISO8601格式日期
  • datetime::timestamp() - 时间戳
  • datetime::birthday() - 生日日期
  • datetime::work_time() - 工作时间

高级功能

并行生成

use dataforge::core::{CoreEngine, GenConfig, GenerationStrategy};

let config = GenConfig {
    batch_size: 1000,
    strategy: GenerationStrategy::Random,
    parallelism: 4,
    ..Default::default()
};

let engine = CoreEngine::new(config);
let results = engine.generate_batch(10000)?;

内存优化

use dataforge::memory::{MemoryPool, MemoryPoolConfig};

let config = MemoryPoolConfig::default();
let mut pool = MemoryPool::new(config);
let buffer = pool.allocate(1024)?;

规则引擎

use dataforge::rules::{RuleEngine, Rule, RuleType};

let mut engine = RuleEngine::new();
engine.add_rule(Rule {
    name: "adult_user".to_string(),
    rule_type: RuleType::Condition,
    condition: "age >= 18".to_string(),
    action: "generate_adult_data".to_string(),
});

配置文件支持

支持TOML和YAML配置文件:

# dataforge.toml
[generation]
batch_size = 1000
strategy = "Random"
null_probability = 0.05

[database]
url = "mysql://user:pass@localhost/db"
batch_size = 5000

性能特性

  • 多线程并行: 基于rayon的高效并行处理
  • 内存池: 减少内存分配开销
  • 批量操作: 优化数据库插入性能
  • 延迟加载: 按需加载数据文件
  • 零拷贝: 减少不必要的内存拷贝

项目结构

dataforge/
├── src/
│   ├── core.rs              # 核心引擎
│   ├── generators/          # 数据生成器
│   ├── regions/             # 地区数据
│   ├── filling/             # 数据库填充
│   ├── multithreading/      # 多线程处理
│   ├── memory/              # 内存管理
│   ├── customization/       # 用户自定义
│   ├── generation/          # 数据生成
│   ├── db/                  # 数据库相关
│   │   └── schema.rs        # 模式解析
│   ├── config.rs            # 配置管理
│   ├── rules/               # 规则引擎
│   └── macros.rs            # 宏定义
├── data/                    # 外部数据文件
├── tests/                   # 测试文件
└── doc/                     # 文档

📚 Ecosystem

dataforge-faker: Ruby Faker-compatible syntax dataforge-sqlx: Async database support via sqlx dataforge-cli: Command-line data generation tool

许可证

本项目采用 MIT 或 Apache-2.0 双重许可证。

贡献

欢迎提交 Issue 和 Pull Request!

Commit count: 0

cargo fmt