6小时从0到1:我用AI造了个分片SQL生成器

TL;DR

2025年12月初,因旧系统数据修复需要,我在没有db-proxy的情况下,用6小时时间让AI从零开发了一个分片SQL生成器。纯Node.js原生实现,支持6种分片算法,包含完整UI界面和Docker部署方案。代码已开源,体验地址:shard-sql-generator-demo.bpdream.com


The Incident:周四下午的未定级问题

那是12月初的一个周四下午,用户资金划转数据异常。

具体场景是这样的:我们有一个项目,需要通过脚本批量操作用户资金。脚本执行后,发现数据错误——幸运的是,错误金额小于应划转金额,没有造成资损。

但问题来了:需要修复数据。

监控系统有1小时延时,等我们发现问题时,已经过去很久了。我赶紧找相关RD拉数据,对方问:“你要哪个分片的数据?”

我愣住了:“分片?db-proxy不是自动路由吗?”

对方:“这个旧系统没有db-proxy,需要手动指定分片ID。”

那一刻,我脑子里闪过一个念头:这不就是典型的"日常琐事"吗?


The Struggle:LLM救场,但痛点犹在

对方RD说:“没事,我让LLM帮我生成分片SQL。”

几分钟后,他发来了一堆SQL语句,每个都带着不同的分片后缀:user_account_0, user_account_1, user_account_2

问题解决了,但我的职业病犯了:

为什么每次都要问LLM?
为什么没有一个统一的工具来处理这种需求?
为什么分片规则要记在脑子里,而不是可视化配置?

我决定:写一个工具网站。


The Epiphany:AI开发,6小时交付

我打开Trae IDE,选择了标准智能体,模型用的是doubao-seed-code。

整个过程是这样的:

14:00 14:30 15:00 15:30 16:00 16:30 17:00 17:30 18:00 18:30 19:00 19:30 20:00 20:30 需求分析与技术选型 架构设计 后端核心功能实现 前端界面开发 API接口对接 功能测试与修复 Docker部署配置 需求阶段 开发阶段 测试与部署 6小时开发时间线

从下午2点开始,到晚上8点,一个完整的分片SQL生成器就上线了。


The System:架构设计

技术选型:纯原生,零依赖

为什么不用Express/Koa/React/Vue?

理由很简单:

  1. 部署成本:第三方依赖越多,部署越复杂
  2. 安全性:依赖越少,攻击面越小
  3. 学习成本:纯原生代码,任何Node.js开发者都能看懂
  4. 性能:原生实现,没有框架开销

核心架构

用户浏览器

HTTP请求

Node.js原生服务器

路由处理

SQL生成器

分片算法引擎

脚本管理器

返回分片SQL

分片算法支持

算法类型适用场景参数说明
取模算法数据均匀分布mod:取模基数
范围分片有明确范围划分rangeRules:范围规则配置
哈希分片字符串类型分片键hashAlgorithm:哈希算法
numShards:分片数量
一致性哈希动态增减分片nodes:节点配置
virtualNodes:虚拟节点数
日期分片时间序列数据dateFormat:日期格式
自定义脚本特殊需求场景script:自定义脚本内容

The Implementation:核心代码解析

SQL生成器:从原始SQL到分片SQL

核心逻辑在core/sql-generator.js:

function generateShardSQL(originalSQL, shardKey, shardValue, shardId) {
  let shardSQL = originalSQL;

  // 1. 处理表名,添加分片后缀
  const fromTableRegex = /\bFROM\s+([a-zA-Z0-9_.]+)(?:\s+AS\s+([a-zA-Z0-9_]+))?\b/gi;
  shardSQL = shardSQL.replace(fromTableRegex, (match, table, alias) => {
    const tableParts = table.split('.');
    const baseTable = tableParts[tableParts.length - 1];
    const schemaPrefix = tableParts.length > 1 ? tableParts.slice(0, -1).join('.') + '.' : '';
    const shardedTable = `${schemaPrefix}${baseTable}_${shardId}`;
    return alias ? `FROM ${shardedTable} AS ${alias}` : `FROM ${shardedTable}`;
  });

  // 2. 添加分片键条件
  const shardCondition = `${shardKey} = ${typeof shardValue === 'number' ? shardValue : `'${shardValue}'`}`;
  const whereIndex = shardSQL.toLowerCase().indexOf(' where ');

  if (whereIndex !== -1) {
    // 已有WHERE子句,添加AND条件
    const whereEnd = whereIndex + 7;
    shardSQL = shardSQL.slice(0, whereEnd) + `${shardCondition} AND ` + shardSQL.slice(whereEnd);
  } else {
    // 没有WHERE子句,直接添加
    shardSQL += ` WHERE ${shardCondition}`;
  }

  return shardSQL;
}

原始SQL:

SELECT * FROM user_account WHERE status = 1

生成后(分片ID=2,分片键=user_id=12345):

SELECT * FROM user_account_2 WHERE user_id = 12345 AND status = 1

分片算法:取模算法示例

const shardAlgorithms = {
  mod: (value, config) => {
    const num = parseInt(value);
    const mod = parseInt(config.mod);
    return isNaN(num) ? 0 : num % mod;
  }
};

示例:

  • user_id = 12345, mod = 4
  • 12345 % 4 = 1
  • 路由到分片1

The UI:现代化界面设计

主界面布局

左侧面板
分片规则配置

中间面板
SQL输入与生成

右侧面板
结果展示与历史

在这里插入图片描述

核心功能模块

  1. 分片规则配置

    • 6种分片算法选择
    • 动态参数配置
    • 自定义脚本编辑器
  2. SQL输入与生成

    • SQL语法高亮
    • 批量分片键值输入
    • 一键生成
  3. 结果展示

    • 分片SQL列表
    • 聚合SQL生成
    • 一键复制/导出
  4. 历史记录

    • 操作历史保存
    • 快速回溯
    • 本地存储

The Deployment:双重部署方案

裸机部署

# 1. 克隆项目
git clone https://github.com/skys-mission/ai-dev-demo.git
cd ai-dev-demo/shard-sql-generator

# 2. 启动服务
node server.js

# 3. 访问应用
# http://localhost:3000

环境要求:

  • Node.js 14.0.0 或更高版本
  • 512MB 以上内存
  • 100MB 以上磁盘空间

Docker部署

# 1. 构建镜像
docker build -t shard-sql-generator .

# 2. 运行容器
docker run -d -p 3000:3000 --name shard-sql-generator shard-sql-generator

# 3. 使用Docker Compose
docker-compose up -d

Dockerfile:

FROM node:14-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

The Impact:实际应用价值

解决的问题

  1. 效率提升:从"问LLM+手动修改"到"一键生成",节省90%时间
  2. 错误减少:避免手动修改SQL时的拼写错误
  3. 知识沉淀:分片规则可视化配置,不再依赖个人记忆
  4. 团队协作:统一的工具,降低沟通成本

适用场景

  • 数据修复:批量修复分片表数据
  • 数据迁移:跨分片数据迁移
  • 数据分析:分析特定分片的数据
  • 日常运维:快速生成分片SQL

The Reflection:AI开发的思考

为什么能6小时完成?

  1. 需求明确:从实际问题出发,没有过度设计
  2. 技术选型简单:纯原生实现,避免框架学习成本
  3. AI辅助:Trae智能体+doubao-seed-code模型,代码生成效率高
  4. MVP思维:先实现核心功能,再迭代优化

AI开发的局限性

  1. 上下文理解:AI对业务逻辑的理解不如人类,需要明确的需求描述
  2. 代码质量:AI生成的代码需要人工review和优化
  3. 调试成本:AI生成的bug需要人类调试,可能比手写更耗时
  4. 维护性:AI生成的代码可读性可能不如手写

最佳实践

  1. 需求先行:明确需求,再让AI实现
  2. 迭代开发:分阶段实现,每阶段验证
  3. 代码Review:AI生成后,人工review必不可少
  4. 测试驱动:写测试用例,确保功能正确

The Code:开源与贡献

项目地址

  • GitHub: https://github.com/skys-mission/ai-dev-demo/tree/main/shard-sql-generator
  • 体验地址: https://shard-sql-generator-demo.bpdream.com

项目结构

shard-sql-generator/
├── core/                 # 核心功能模块
│   ├── sql-generator.js  # 分片SQL生成器
│   └── script-manager.js # 脚本管理器
├── public/               # 静态文件目录
│   ├── index.html        # 主页面
│   ├── styles.css        # 样式文件
│   ├── app.js            # 前端逻辑
│   └── modules/          # 功能模块
│       ├── shard-algorithm.js
│       ├── sql-handler.js
│       ├── script-manager.js
│       └── history-manager.js
├── server.js             # 服务器入口
├── Dockerfile            # Docker配置
├── docker-compose.yml    # Docker Compose配置
└── package.json          # 项目配置

技术栈

  • 后端:Node.js 原生 (无第三方依赖)
  • 前端:HTML5 + CSS3 + JavaScript (原生)
  • 存储:localStorage + JSON文件
  • 部署:裸机部署 / Docker容器

Conclusion

6小时,从0到1,一个完整的分片SQL生成器。

这不是什么"革命性"的技术创新,但它解决了一个真实存在的痛点。

在大厂,我们每天都在处理各种"琐事":数据修复、SQL生成、脚本编写…这些事情看似简单,但重复劳动会消耗大量时间。

AI的价值不在于替代人类,而在于把人类从重复劳动中解放出来,让我们专注于更有价值的事情。

这个项目只是一个开始。未来,我会继续用AI解决更多日常琐事,并把经验分享出来。

如果你也有类似的需求,欢迎试用,也欢迎贡献代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值