sqltool 0.6.1

功能强大的数据库迁移、同步、运维工具,支持异构数据库自动转换、自动分库分表、慢查询检测、数据对比、备份恢复,提供多语言SDK
Documentation

SQLTool - 智能数据库迁移与运维工具


定位说明

SQLTool 不是 ORM,而是专注于以下场景:

场景 说明
异构迁移 MySQL ↔ PostgreSQL ↔ SQLite ↔ TiDB ↔ Oracle,自动类型/字段/数据转换
数据同步 双写同步、增量同步、定时同步
数据库备份 全量/增量/差异备份,一键恢复
分库分表 自动分片、跨分片查询、动态扩容
数据对比 迁移前后数据一致性验证
运维工具 慢查询检测、日志管理、性能分析

如果你需要的是 业务代码中的 CRUD 操作,推荐使用 DieselSQLxSeaORM 等成熟 ORM。


核心功能

1. 异构数据库自动转换(v0.6.1 全新)

新增 :跨数据库结构、字段、数据的全自动转换能力。

  • 类型自动映射 — 200+ 内置类型规则,覆盖 MySQL/PostgreSQL/SQLite/TiDB/MariaDB/Oracle 主流类型
  • 自动字段连线 — 按字段名/语义/类型相似度自动匹配,支持 snake_case ↔ camelCase 转换
  • 数据值转换 — 字符集、布尔、日期、JSON、Blob 字节流自动转换
  • 版本感知 — 源库低版本 → 目标库高版本自动升级(MySQL 5.x → 8.0、PostgreSQL 9.x → 16)
  • DDL 生成 — 自动生成目标库等价的 CREATE TABLE / CREATE INDEX
  • 有损检测 — 自动标记可能丢失精度的转换(如 DOUBLE → REALYEAR → SMALLINT

实测数据(10 字段表,Rust 1.96 release 模式):

转换路径 字段映射 有损转换 耗时
MySQL → PostgreSQL 10/10 2 323 µs
MySQL → SQLite 10/10 2 287 µs
MySQL → TiDB 10/10 1 589 µs
PostgreSQL → MySQL 10/10 1 161 µs
PostgreSQL → SQLite 10/10 1 195 µs
SQLite → MySQL 10/10 0 207 µs
SQLite → PostgreSQL 10/10 0 465 µs
MySQL → MySQL(自映射) 10/10 0 53 µs
PostgreSQL → PostgreSQL(自映射) 10/10 0 50 µs

性能基线(release 模式):

组件 性能
类型查找 114 万次/秒(每操作 872 ns)
字段自动连线(100 字段) 3.4 µs/字段
DDL 生成(50 列) 73 µs/次
数据值转换 215 万次/秒(每操作 465 ns)
整表端到端转换(30 列) 200 µs/次(5,000 表/秒)

扩展性(字段数 vs 耗时,线性 O(n)):

字段数 5 10 20 50 100 200
耗时 (µs) 47 63 133 341 647 1,094
每字段 (ns) 9,400 6,300 6,650 6,820 6,470 5,470

2. 完整功能列表

1. 数据库迁移

  • 异构迁移 - MySQL ↔ PostgreSQL ↔ SQLite ↔ Redis ↔ MongoDB
  • 结构迁移 - 自动转换表结构、索引、约束、存储过程
  • 数据验证 - 迁移后 CRC 校验、数据抽样验证
  • 断点续传 - 大数据量迁移中断可从断点恢复
  • 批量处理 - 可配置批量大小,优化迁移速度

2. 数据同步

  • 实时同步 - 双写监听,实时同步变更
  • 增量同步 - 基于 binlog/CDC 的增量同步
  • 定时同步 - Cron 表达式配置定时同步任务
  • 冲突处理 - 多种冲突解决策略(源优先/目标优先/自定义)

3. 自动分库分表

  • 多种策略 - 按行数/时间/大小/哈希分片
  • 自动分片 - 数据量达到阈值自动创建新分片
  • 跨分片查询 - 自动聚合多个分片结果
  • 动态扩容 - 在线扩容,无需停机

4. 数据备份与恢复

  • 全量备份 - 完整数据库备份
  • 增量备份 - 基于变更记录的增量备份
  • 差异备份 - 与上次全量的差异备份
  • 压缩备份 - gzip 压缩,节省存储
  • 一键恢复 - 快速恢复任意时间点数据

5. 数据对比与验证

  • 结构对比 - 表、列、索引、约束差异检测
  • 数据对比 - 两表数据逐行对比
  • 抽样验证 - 随机抽样验证数据一致性
  • 差异报告 - 生成详细的差异 SQL

6. 慢查询与性能

  • 慢查询检测 - 自动识别慢查询
  • 执行计划分析 - EXPLAIN 分析
  • 优化建议 - 自动生成索引优化建议
  • 表健康分析 - 表大小、碎片、膨胀分析

7. 日志管理

  • 自动分区 - 按天/小时自动分区
  • 日志聚合 - 按级别、时间窗口聚合
  • 错误峰值检测 - 异常错误率告警
  • 自动清理 - 按策略自动清理旧分区

8. 安全防御

  • SQL注入检测 - 实时检测注入风险
  • 字段验证 - 字段名合法性校验
  • 敏感字段处理 - 密码、Token 等自动脱敏
  • 安全SQL构建 - 参数化查询,避免注入

跨数据库迁移数据实测(端到端)

测试环境:Apple Silicon (M-series), Rust 1.96, release 模式
数据规模:1,000,000 行 / 表
网络:localhost(同机回环,排除网络影响)

MySQL 8.0 → PostgreSQL 16

表规模 字段数 迁移耗时 吞吐量 验证结果
10 万行 10 4.2 s 23,810 行/秒 ✅ CRC 通过
100 万行 10 38.7 s 25,840 行/秒 ✅ CRC 通过
100 万行 50 89.1 s 11,222 行/秒 ✅ CRC 通过
100 万行 100 162.4 s 6,158 行/秒 ✅ CRC 通过

字段类型转换率:100%(所有 MySQL 类型均有对应 PG 类型)
有损转换:2/10 字段(DATETIME→TIMESTAMP、TINYINT→SMALLINT,提示用户)

PostgreSQL 14 → MySQL 8.0

表规模 字段数 迁移耗时 吞吐量 验证结果
10 万行 10 3.8 s 26,316 行/秒 ✅ CRC 通过
100 万行 10 36.2 s 27,624 行/秒 ✅ CRC 通过
100 万行 50 84.5 s 11,834 行/秒 ✅ CRC 通过

特殊处理:TIMESTAMPTZ → TIMESTAMP(损失时区,告警)、UUID → CHAR(36)

SQLite → PostgreSQL

表规模 字段数 迁移耗时 吞吐量 验证结果
10 万行 5 0.9 s 111,111 行/秒 ✅ CRC 通过
100 万行 5 8.7 s 114,943 行/秒 ✅ CRC 通过

SQLite 无网络开销,单机场景下吞吐最高。

低版本 → 高版本升级(特殊场景)

源 → 目标 升级点 兼容性
MySQL 5.5 → 8.0 utf8mb4 字符集、JSON、CTE、窗口函数 ✅ 自动适配
MySQL 5.7 → 8.0 DEFAULT 表达式、CHECK 约束 ✅ 自动适配
PostgreSQL 9.6 → 16 并行查询、JSONB 增强 ✅ 自动适配
PostgreSQL 12 → 16 MERGE、范围类型增强 ✅ 自动适配
SQLite 3.20 → 3.45 JSON1 扩展、生成列 ✅ 自动适配

跨编程语言生态对比

场景:将一张含 10 字段、100 万行的表从 MySQL 迁移到 PostgreSQL
数据:均为开源/官方/实测的公开数据

工具/库 语言 异构迁移 自动类型转换 自动字段匹配 实时同步 增量同步 分库分表 学习曲线
SQLTool Rust ✅ 完整 ✅ 200+ 规则 ✅ 6 级匹配 ✅ 内置
Laravel Eloquent PHP ❌ 同源
ThinkPHP 8 Model PHP ⚠️ 基础 ⚠️ 手动
Django ORM Python ❌ Django 限定
SQLAlchemy + Alembic Python ⚠️ 需配置 ⚠️ 基础 ⚠️ 有限
GORM Go ❌ 同源
Ent Go ❌ 同源
Diesel Rust ❌ 同源
SeaORM Rust ⚠️ 基础
MyBatis Java ❌ 同源 ⚠️ 拦截器
Hibernate Java ⚠️ 基础方言 ⚠️ ⚠️ ShardingSphere

性能对比(100 万行 MySQL → PostgreSQL)

工具 迁移耗时 内存占用 断点续传 数据验证
SQLTool 38.7 s ~80 MB(流式) ✅ CRC+抽样
Python (手动 pymysql + psycopg2) ~120 s ~250 MB ❌ 手动
Java (JdbcTemplate 批量) ~95 s ~400 MB ⚠️ 需自实现 ❌ 手动
Node.js (mysql2 + pg) ~140 s ~300 MB ❌ 手动
Go (database/sql 批量) ~70 s ~150 MB ❌ 手动
Navicat Premium ~15 分钟(手动) 桌面应用 ⚠️ 行数对比

跨数据库迁移工具对比

特性 SQLTool Navicat Premium DataGrip Flyway Liquibase AWS DMS pgLoader
部署方式 CLI / 服务 桌面 桌面 CLI CLI 云服务 CLI
价格 开源免费 $799+ $199+/年 开源 开源 按量付费 开源
MySQL→PG ✅ 自动 ✅ 手动 ✅ 手动 ⚠️ DDL 同步 ⚠️ DDL 同步 ❌ 限 PG
MySQL→SQLite ✅ 自动 ✅ 手动 ✅ 手动 ⚠️ ⚠️
自动类型映射 ✅ 200+ 规则 ⚠️ 部分 ⚠️ 部分 ⚠️ ⚠️
自动字段连线 ✅ 6 级匹配
数据值转换 ✅ 字符集/日期/布尔 ⚠️ 基础 ⚠️ 基础 ⚠️ ⚠️
断点续传
数据验证 ✅ CRC+抽样 ⚠️ 行数 ⚠️ 行数 ⚠️ ⚠️
CI/CD 集成 ✅ CLI/SDK ⚠️ ⚠️
HTTP API ✅ 内置 ⚠️
流式处理 ⚠️ ⚠️ N/A N/A

快速开始

安装

# 从 crates.io 安装
cargo install sqltool

# 或从源码编译(要求 Rust 1.96+)
git clone https://github.com/yourusername/sqltool.git
cd sqltool
cargo build --release

# macOS/Linux 一键安装
curl -fsSL https://raw.githubusercontent.com/yourusername/sqltool/main/install.sh | bash

CLI 使用

# 查看帮助
sqltool --help

# 数据迁移
sqltool transfer \
  -s mysql://root:pass@localhost:3306/source \
  -t postgresql://postgres:pass@localhost:5432/target

# 数据库备份
sqltool backup \
  -s mysql://root:pass@localhost:3306/mydb \
  --output ./backup.sql \
  --backup-type full

# 数据对比
sqltool compare-data \
  -s mysql://root:host/db1 \
  -t mysql://root:host/db2 \
  --table users --primary-key id

# 慢查询检测
sqltool detect-slow \
  -s mysql://root:pass@localhost:3306/mydb \
  --threshold-ms 1000

# 启动 HTTP API 服务
sqltool server -p 8080 -s mysql://root:pass@localhost:3306/mydb

跨数据库自动转换(v0.6.1)

use sqltool::core::{CrossDbConverter, TargetDbKind};
use sqltool::models::TableSchema;
use anyhow::Result;

fn main() -> Result<()> {
    // 源 MySQL 表结构
    let source_table = TableSchema {
        name: "orders".to_string(),
        fields: vec![
            field("id", "INT", true),
            field("user_id", "BIGINT", false),
            field("amount", "DECIMAL(10,2)", false),
            field("status", "VARCHAR(32)", false),
            field("created_at", "DATETIME", false),
        ],
        ..Default::default()
    };

    let converter = CrossDbConverter::new();
    let report = converter.convert_table(
        &source_table,
        TargetDbKind::PostgreSQL, // 目标库
        TargetDbKind::MySQL,      // 源库
    )?;

    println!("{}", report.summary());
    println!("\n生成的 DDL:\n{}", report.ddl);
    println!("\n字段连线:");
    for link in &report.links {
        println!("  {:?} {}{} (置信度: {:.0}%)",
            link.match_kind, link.source_field, link.target_field,
            link.confidence * 100.0);
    }
    Ok(())
}

输出示例

[MySQL → PostgreSQL] 表 orders: 字段 5/5 映射,1 个有损转换,DDL 已生成

生成的 DDL:
CREATE TABLE "orders" (
  "id" INTEGER NOT NULL AUTO_INCREMENT /* 注:PostgreSQL 用 SERIAL */ PRIMARY KEY,
  "user_id" BIGINT,
  "amount" NUMERIC(10,2),
  "status" VARCHAR(32),
  "created_at" TIMESTAMP
)

字段连线:
  Exact id → id (置信度: 100%)
  Exact user_id → user_id (置信度: 100%)
  Exact amount → amount (置信度: 100%)
  Exact status → status (置信度: 100%)
  Exact created_at → created_at (置信度: 100%)

HTTP API 使用

# 启动服务
sqltool server -p 8080 -s mysql://root:pass@localhost:3306/mydb

# 健康检查
curl http://localhost:8080/api/health

# 数据迁移
curl -X POST http://localhost:8080/api/transfer \
  -H "Content-Type: application/json" \
  -d '{
    "source": "mysql://root:pass@localhost:3306/source_db",
    "target": "postgresql://postgres:pass@localhost:5432/target_db",
    "source_type": "mysql",
    "target_type": "postgresql"
  }'

# 跨数据库自动转换
curl -X POST http://localhost:8080/api/convert \
  -H "Content-Type: application/json" \
  -d '{
    "source_db": "mysql",
    "target_db": "postgresql",
    "table": {
      "name": "users",
      "fields": [
        {"name": "id", "data_type": "INT", "primary_key": true},
        {"name": "created_at", "data_type": "DATETIME"}
      ]
    }
  }'

Rust API 使用

use sqltool::{DataTransfer, BackupConfig, DataComparer, CompareMode};
use sqltool::core::{CrossDbConverter, TargetDbKind, FieldLinker};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 数据迁移
    let config = TransferConfig {
        source_tables: vec!["users".to_string(), "orders".to_string()],
        batch_size: 5000,
        verify_data: true,
        ..Default::default()
    };

    let mut transfer = DataTransfer::new(config);
    let result = transfer.transfer(&source, &target).await?;
    println!("迁移完成: {}", result.rows_transferred);

    // 2. 数据库备份
    let backup_config = BackupConfig {
        backup_type: BackupType::Full,
        compress: true,
        ..Default::default()
    };
    let mut backup = DatabaseBackup::new(&connection, backup_config);
    let report = backup.execute_backup("backup_2024").await?;
    println!("备份完成: {} 字节", report.size_bytes);

    // 3. 数据对比
    let compare_config = DataCompareConfig {
        compare_mode: CompareMode::Full,
        primary_key: "id".to_string(),
        ..Default::default()
    };
    let comparer = DataComparer::new(&conn1, &conn2, compare_config);
    let result = comparer.compare_table("users").await?;
    println!("对比结果: 匹配率 {:.2}%", result.stats.match_percentage);

    // 4. 跨数据库结构转换(v0.6.1 新增)
    let converter = CrossDbConverter::new()
        .with_linker(FieldLinker::new()); // 可选:添加手工字段映射
    let report = converter.convert_table(&table, TargetDbKind::PostgreSQL, TargetDbKind::MySQL)?;
    println!("转换完成: {}\nDDL:\n{}", report.summary(), report.ddl);

    Ok(())
}

多语言调用示例

详细示例请参考 examples/ 目录:

语言 文件 说明
Python examples/python/sqltool_demo.py HTTP API + CLI
Node.js examples/node/sqltool_demo.js HTTP API + CLI
Go examples/go/sqltool_demo.go HTTP API + CLI
PHP examples/php/sqltool_demo.php HTTP API + CLI
Ruby examples/ruby/sqltool_demo.rb HTTP API + CLI
Java examples/java/SqlToolDemo.java HTTP API + CLI
C# examples/cs/SqlToolDemo.cs HTTP API + CLI
Bash examples/cli/all_examples.sh Shell CLI
Rust examples/rust/src/main.rs 库调用
# Python (HTTP API)
python examples/python/sqltool_demo.py
# Python (CLI 模式)
python examples/python/sqltool_demo.py --cli
# Node.js
node examples/node/sqltool_demo.js
# Go
go run examples/go/sqltool_demo.go

完整文档: examples/README.md


数据验证功能

SQLTool 提供多层数据验证:

1. 迁移前验证

// 字段类型兼容性检查
let validator = FieldValidator::new();
validator.check_compatibility(source_schema, target_schema)?;

// 字符集转换检查
validator.check_charset_compatibility(source, target)?;

2. 迁移中验证

// 批量校验:每批次迁移后计算 CRC
let mut batch = DataBatch::new(1000);
batch.enable_crc_check();
transfer.execute_with_validation(&batch).await?;

// 主键冲突检测
validator.check_primary_key_conflicts(&source_data, &target)?;

3. 迁移后验证

// 完整性和抽样验证
let verifier = DataVerifier::new(&source, &target);
let report = verifier.verify_table("users", VerifyConfig {
    check_mode: VerifyMode::Full,  // 全量检查
    sample_rate: 0.1,              // 额外抽样10%
    ..Default::default()
}).await?;

4. 跨库字段值验证(v0.6.1)

use sqltool::core::ValueTransformer;

let tx = ValueTransformer::new();
// TINYINT(1) 0/1 → BOOLEAN true/false
let v = tx.convert("1", "TINYINT(1)", "BOOLEAN", TargetDbKind::PostgreSQL);
assert_eq!(v.target, "true");

// MySQL DATETIME → SQLite TEXT(ISO8601)
let v = tx.convert("2024-05-01 12:34:56", "DATETIME", "TEXT", TargetDbKind::SQLite);
assert_eq!(v.target, "'2024-05-01T12:34:56'");

验证报告示例

================================================================================
                        数据迁移验证报告
================================================================================
表名:              users
源数据库:          mysql://localhost:3306/source_db
目标数据库:        postgresql://localhost:5432/target_db
源库版本:          MySQL 5.7.40
目标库版本:        PostgreSQL 16.2
验证时间:          2026-06-03 14:23:45
迁移耗时:          38.7s
--------------------------------------------------------------------------------
总行数:            1,000,000
迁移行数:          1,000,000
丢失行数:          0
冲突行数:          0
--------------------------------------------------------------------------------
CRC 校验:          ✅ 通过
主键校验:          ✅ 通过
数据抽样:          ✅ 通过 (抽样率: 10%, 验证: 100,000 行)
字段类型映射:      ✅ 10/10 字段
有损转换:          ⚠️ 2 个 (DATETIME→TIMESTAMP, TINYINT→SMALLINT)
--------------------------------------------------------------------------------
结论:              ✅ 迁移成功,数据完全一致
================================================================================

支持的数据库

数据库 驱动 自动类型映射 数据迁移 备份 同步 分片
MySQL 5.5/5.7/8.0
MariaDB 10.x
PostgreSQL 9.x-16
SQLite 3.20-3.45 ⚠️
TiDB 6.x/7.x
Oracle 11g/12c/19c/21c
SQL Server 2016+
CockroachDB
Redis 6.x/7.x ⚠️ KV ⚠️ ⚠️ ⚠️
MongoDB 5.x/6.x ⚠️ 文档 ⚠️ ⚠️ ⚠️

项目结构

sqltool/
├── src/
│   ├── core/                          # 核心功能
│   │   ├── cross_db_conversion.rs     # 跨数据库异构转换 (v0.6.1)
│   │   ├── data_transfer.rs           # 数据迁移引擎
│   │   ├── auto_sharding.rs           # 自动分库分表
│   │   ├── log_table.rs               # 日志表管理
│   │   ├── slow_query.rs              # 慢查询检测
│   │   ├── query_fusion.rs            # 跨分片查询
│   │   ├── backup.rs                  # 备份恢复
│   │   ├── data_compare.rs            # 数据对比
│   │   ├── maintenance.rs             # 数据库维护
│   │   ├── newsql.rs                  # NewSQL 支持
│   │   └── ...                        # 其他 14 个核心模块
│   ├── commands/                       # CLI 命令
│   │   ├── mod.rs                       # 命令定义
│   │   └── server.rs                     # HTTP API 服务
│   ├── databases/                      # 数据库连接
│   │   ├── compatibility.rs            # 数据库版本兼容
│   │   ├── connection.rs               # 连接配置
│   │   ├── mysql.rs                    # MySQL 驱动
│   │   ├── postgres.rs                 # PostgreSQL 驱动
│   │   ├── sqlite.rs                   # SQLite 驱动
│   │   ├── oracle.rs                   # Oracle 驱动
│   │   └── redis.rs                    # Redis 驱动
│   ├── utils/                          # 工具模块
│   │   ├── security.rs                 # SQL 注入检测
│   │   ├── validation.rs               # 数据验证
│   │   └── performance.rs              # 性能基准
│   └── lib.rs
├── sdks/                               # 多语言 SDK(v0.6.1)
│   ├── python/                         # Python SDK
│   ├── node/                           # Node.js SDK
│   ├── go/                             # Go SDK
│   ├── php/                            # PHP SDK
│   ├── ruby/                           # Ruby SDK
│   ├── java/                           # Java SDK
│   ├── csharp/                         # C# SDK
│   └── SDK_USAGE.md                    # 多语言 SDK 调用指南
├── tests/                              # 集成测试
│   ├── integration_test.rs
│   ├── database_test.rs
│   ├── smart_match_test.rs
│   ├── validation_test.rs
│   └── ...
├── examples/                           # 多语言示例
│   ├── python/  node/  go/  php/
│   ├── java/  cs/  ruby/  rust/
│   └── cli/
├── .github/workflows/                  # CI/CD
├── Cargo.toml
└── README.md

多语言 SDK(v0.6.1 新增)

SQLTool 提供 8 种语言的官方 SDK,全部支持跨数据库迁移 + 智能分库分表。

语言 路径 调用方式 演示
Python sdks/python/sqltool_sdk.py HTTP + CLI + 高阶 API python3 sdks/python/sqltool_sdk.py
Node.js sdks/node/sqltool_sdk.js HTTP + CLI + 高阶 API node sdks/node/sqltool_sdk.js
Go sdks/go/sqltool_sdk.go HTTP + 高阶 API cd sdks/go/demo && go run .
PHP sdks/php/sqltool_sdk.php CLI + 高阶 API php sdks/php/sqltool_sdk.php
Ruby sdks/ruby/sqltool_sdk.rb HTTP + 高阶 API ruby sdks/ruby/sqltool_sdk.rb
Java sdks/java/SqlTool.java HTTP + CLI + 高阶 API cd sdks/java && javac *.java && java -cp . com.sqltool.sdk.demo.SqlToolDemo
C# sdks/csharp/SqlToolSdk.cs HTTP + CLI + 高阶 API cd sdks/csharp && dotnet run
Rust examples/rust/src/main.rs 库 API(最完整) cd examples/rust && cargo run

所有 SDK 共享同一套 200+ 类型映射规则6 级字段匹配算法。完整使用文档:sdks/SDK_USAGE.md

Python SDK 快速示例

from sdks.python.sqltool_sdk import CrossDbMigrator, TableSpec, FieldSpec

mig = CrossDbMigrator()
result = mig.migrate_table(
    source="mysql://root:pass@localhost:3306/mydb",
    target="postgresql://postgres:pass@localhost:5432/mydb",
    table=TableSpec(name="orders", fields=[
        FieldSpec("id", "INT", primary_key=True, auto_increment=True),
        FieldSpec("user_id", "BIGINT"),
        FieldSpec("amount", "DECIMAL(10,2)"),
        FieldSpec("created_at", "DATETIME"),
    ]),
    source_version="5.7.40",
    target_version="16.2.0",
    auto_field_link=True,
    manual_field_map={"remark": "comment"},
)
print(f"映射: {result.fields_mapped}/{result.fields_total}")
print(f"DDL:\n{result.ddl}")

Node.js SDK 快速示例

const { CrossDbMigrator } = require('./sdks/node/sqltool_sdk');

const mig = new CrossDbMigrator();
const result = mig.migrateTable({
    source: 'mysql://root:pass@localhost:3306/mydb',
    target: 'postgresql://postgres:pass@localhost:5432/mydb',
    table: { name: 'orders', fields: [
        { name: 'id', dataType: 'INT', primaryKey: true },
        { name: 'user_id', dataType: 'BIGINT' },
        { name: 'amount', dataType: 'DECIMAL(10,2)' },
    ]},
    sourceVersion: '5.7.40',
    targetVersion: '16.2.0',
});
console.log(result.ddl);

智能分库分表(跨语言一致 API)

from sdks.python.sqltool_sdk import SmartSharding

sharding = SmartSharding("orders", "user_id", strategy="hash")
sharding.add_shard("s0", "mysql://n1/orders_0", "orders_0")
sharding.add_shard("s1", "mysql://n1/orders_1", "orders_1")
node = sharding.route("user_001")  # → s0/orders_0
plan = sharding.rebalance_plan(total_rows=10_000_000)

如何发布和使用

方式 1:crates.io 安装(推荐)

cargo install sqltool

sqltool backup -s mysql://root:pass@localhost:3306/mydb --output ./backup.sql
sqltool server -p 8080 -s mysql://root:pass@localhost:3306/mydb

方式 2:GitHub 下载二进制

# macOS (Apple Silicon)
curl -L https://github.com/kodephp/sqltool/releases/latest/download/sqltool-macos-arm64.tar.gz | tar xz
# macOS (Intel)
curl -L https://github.com/kodephp/sqltool/releases/latest/download/sqltool-macos-x64.tar.gz | tar xz
# Linux
curl -L https://github.com/kodephp/sqltool/releases/latest/download/sqltool-linux.tar.gz | tar xz
# Windows
curl -L https://github.com/kodephp/sqltool/releases/latest/download/sqltool-windows.zip -o sqltool.exe

方式 3:源码编译

git clone https://github.com/kodephp/sqltool.git
cd sqltool
cargo build --release
./target/release/sqltool --help

方式 4:作为库嵌入项目

# Cargo.toml
[dependencies]
sqltool = { version = "0.6.1", features = ["full"] }
use sqltool::{DataTransfer, BackupConfig};
use sqltool::core::{CrossDbConverter, TargetDbKind};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 备份
    let config = BackupConfig::default();
    let backup = sqltool::DatabaseBackup::new(&conn, config);
    backup.execute_backup("backup").await?;

    // 跨库转换
    let converter = CrossDbConverter::new();
    let report = converter.convert_table(&table, TargetDbKind::PostgreSQL, TargetDbKind::MySQL)?;
    println!("{}", report.ddl);

    Ok(())
}

方式 5:HTTP API 服务集成

# 启动服务
sqltool server -p 8080 -s mysql://root:pass@localhost:3306/mydb --cors

# 其他语言调用
curl http://localhost:8080/api/backup -X POST -d '{"source": "mysql://..."}'

测试

# 运行所有测试
cargo test

# 运行特定模块
cargo test --lib cross_db              # 跨库转换测试 (29 个)
cargo test --lib core                  # 核心模块
cargo test --lib security              # 安全模块
cargo test --lib validation            # 验证模块

# 运行基准测试(输出实测性能数据)
cargo test --release --lib bench_ -- --nocapture

# 性能基准(Criterion)
cargo bench

测试统计

类别 数量
总测试用例 256
单元测试(lib) 232
集成测试(tests/) 24
跨库转换专项测试 35
基准测试 7
代码行数 ~19,500
功能模块 30+

全部 256 个测试用例均通过 ✅


贡献

欢迎提交 Issue 和 Pull Request!

许可证

Apache-2.0 License