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。

整个过程是这样的:

gantt title 6小时开发时间线 dateFormat HH:mm axisFormat %H:%M section 需求阶段 需求分析与技术选型 :a1, 14:00, 30m 架构设计 :a2, after a1, 30m section 开发阶段 后端核心功能实现 :b1, after a2, 2h 前端界面开发 :b2, after b1, 2h API接口对接 :b3, after b2, 30m section 测试与部署 功能测试与修复 :c1, after b3, 30m Docker部署配置 :c2, after c1, 30m

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


The System:架构设计

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

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

理由很简单:

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

核心架构

graph TD A[用户浏览器] --> B[HTTP请求] B --> C[Node.js原生服务器] C --> D[路由处理] D --> E[SQL生成器] D --> F[分片算法引擎] D --> G[脚本管理器] E --> H[返回分片SQL] F --> H G --> H H --> A style A fill:#e1f5ff style C fill:#fff4e1 style H fill:#e8f5e9

分片算法支持

算法类型 适用场景 参数说明
取模算法 数据均匀分布 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 = 4
  • 12345 % 4 = 1
  • 路由到分片1

The UI:现代化界面设计

主界面布局

graph LR A[左侧面板
分片规则配置] --> B[中间面板
SQL输入与生成] B --> C[右侧面板
结果展示与历史] style A fill:#e3f2fd style B fill:#f3e5f5 style C fill:#e8f5e9

核心功能模块

  1. 分片规则配置

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

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

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

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

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:实际应用价值

解决的问题

  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:开源与贡献

项目地址

项目结构

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解决更多日常琐事,并把经验分享出来。

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

相关推荐
毕设源码-郭学长5 小时前
【开题答辩全过程】以 基于springboot 的豪华婚车租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
乱世刀疤6 小时前
Claude Code实战:捕获视频链接并下载
ai编程
Loo国昌7 小时前
深入理解 FastAPI:Python高性能API框架的完整指南
开发语言·人工智能·后端·python·langchain·fastapi
码农水水8 小时前
米哈游Java面试被问:机器学习模型的在线服务和A/B测试
java·开发语言·数据库·spring boot·后端·机器学习·word
酉鬼女又兒9 小时前
SQL24 统计每个用户的平均刷题数
数据库·sql·mysql
计算机学姐9 小时前
基于SpringBoot的美食分享交流平台
java·spring boot·后端·spring·java-ee·intellij-idea·美食
源代码•宸10 小时前
Leetcode—746. 使用最小花费爬楼梯【简单】
后端·算法·leetcode·职场和发展·golang·记忆化搜索·动规
野人李小白11 小时前
DBeaver 界面友好,支持多种数据库,具备强大的 SQL 编辑、可视化查询、数据迁移及插件扩展功能,是开发者首选的数据库管理工具。
数据库·sql
山峰哥11 小时前
SQL索引优化实战:3000字深度解析查询提速密码
大数据·数据库·sql·编辑器·深度优先
毕设源码-朱学姐11 小时前
【开题答辩全过程】以 基于Django框架中山社区社会补助系统为例,包含答辩的问题和答案
后端·python·django