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。
整个过程是这样的:
从下午2点开始,到晚上8点,一个完整的分片SQL生成器就上线了。
The System:架构设计
技术选型:纯原生,零依赖
为什么不用Express/Koa/React/Vue?
理由很简单:
- 部署成本:第三方依赖越多,部署越复杂
- 安全性:依赖越少,攻击面越小
- 学习成本:纯原生代码,任何Node.js开发者都能看懂
- 性能:原生实现,没有框架开销
核心架构
分片算法支持
| 算法类型 | 适用场景 | 参数说明 |
|---|---|---|
| 取模算法 | 数据均匀分布 | mod:取模基数 |
| 范围分片 | 有明确范围划分 | rangeRules:范围规则配置 |
| 哈希分片 | 字符串类型分片键 | hashAlgorithm:哈希算法 numShards:分片数量 |
| 一致性哈希 | 动态增减分片 | nodes:节点配置 virtualNodes:虚拟节点数 |
| 日期分片 | 时间序列数据 | dateFormat:日期格式 |
| 自定义脚本 | 特殊需求场景 | script:自定义脚本内容 |
The Implementation:核心代码解析
SQL生成器:从原始SQL到分片SQL
核心逻辑在core/sql-generator.js:
javascript
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:
sql
SELECT * FROM user_account WHERE status = 1
生成后(分片ID=2,分片键=user_id=12345):
sql
SELECT * FROM user_account_2 WHERE user_id = 12345 AND status = 1
分片算法:取模算法示例
javascript
const shardAlgorithms = {
mod: (value, config) => {
const num = parseInt(value);
const mod = parseInt(config.mod);
return isNaN(num) ? 0 : num % mod;
}
};
示例:
user_id = 12345,mod = 412345 % 4 = 1- 路由到分片1
The UI:现代化界面设计
主界面布局
分片规则配置] --> B[中间面板
SQL输入与生成] B --> C[右侧面板
结果展示与历史] style A fill:#e3f2fd style B fill:#f3e5f5 style C fill:#e8f5e9

核心功能模块
-
分片规则配置
- 6种分片算法选择
- 动态参数配置
- 自定义脚本编辑器
-
SQL输入与生成
- SQL语法高亮
- 批量分片键值输入
- 一键生成
-
结果展示
- 分片SQL列表
- 聚合SQL生成
- 一键复制/导出
-
历史记录
- 操作历史保存
- 快速回溯
- 本地存储
The Deployment:双重部署方案
裸机部署
bash
# 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部署
bash
# 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:
dockerfile
FROM node:14-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
The Impact:实际应用价值
解决的问题
- 效率提升:从"问LLM+手动修改"到"一键生成",节省90%时间
- 错误减少:避免手动修改SQL时的拼写错误
- 知识沉淀:分片规则可视化配置,不再依赖个人记忆
- 团队协作:统一的工具,降低沟通成本
适用场景
- 数据修复:批量修复分片表数据
- 数据迁移:跨分片数据迁移
- 数据分析:分析特定分片的数据
- 日常运维:快速生成分片SQL
The Reflection:AI开发的思考
为什么能6小时完成?
- 需求明确:从实际问题出发,没有过度设计
- 技术选型简单:纯原生实现,避免框架学习成本
- AI辅助:Trae智能体+doubao-seed-code模型,代码生成效率高
- MVP思维:先实现核心功能,再迭代优化
AI开发的局限性
- 上下文理解:AI对业务逻辑的理解不如人类,需要明确的需求描述
- 代码质量:AI生成的代码需要人工review和优化
- 调试成本:AI生成的bug需要人类调试,可能比手写更耗时
- 维护性:AI生成的代码可读性可能不如手写
最佳实践
- 需求先行:明确需求,再让AI实现
- 迭代开发:分阶段实现,每阶段验证
- 代码Review:AI生成后,人工review必不可少
- 测试驱动:写测试用例,确保功能正确
The Code:开源与贡献
项目地址
- GitHub : github.com/skys-missio...
- 体验地址 : shard-sql-generator-demo.bpdream.com
项目结构
csharp
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解决更多日常琐事,并把经验分享出来。
如果你也有类似的需求,欢迎试用,也欢迎贡献代码。