news 2026/4/18 9:11:15

拒绝 CRUD 搬砖:我如何用脚本 + 模板把重复工作降到 10%

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
拒绝 CRUD 搬砖:我如何用脚本 + 模板把重复工作降到 10%

一、真实痛点引入:我们是工程师,还是“高级打字员”?

回想一下你最近接的一个需求:“给后台增加一个商品分类管理功能”。

逻辑极其简单:增删改查(CRUD)。但你需要做哪些动作?

  1. 设计 MySQL 表结构create table...
  2. 在 Java/Go 代码里定义实体类Struct/POJO
  3. 写 DAO 层(Mapper/Repository),写 SQL。
  4. 写 Service 层,把 DAO 调一遍。
  5. 写 Controller 层,定义 Request/Response DTO,做参数校验。
  6. 注册路由,写 API 文档…

这套流程走下来,至少 2 小时。其中1 小时 50 分钟在机械地复制粘贴、修改变量名,只有 10 分钟在思考“分类能不能重复”、“删除时有没有级联逻辑”。

这种工作不是在写代码,是在消耗生命。作为 1-5 年经验的开发者,如果你的核心竞争力还停留在“我 CRUD 写得快”,那么 35 岁危机离你真的很近。

今天,我将把架构师团队内部使用的**“代码生成方法论”**开源出来。不依赖任何重型框架,用最简单的 Python 脚本 + Jinja2 模板,教你搭建一套属于自己的“效率引擎”。


二、核心问题拆解:从“复制粘贴”到“Schema 驱动”

解决重复工作的进化路径通常有三层:

  1. 石器时代(CV 大法):打开旧代码 -> 复制 -> 粘贴 -> 全局替换“User”为“Product”。
  • 缺点:容易漏改,容易把 bug 复制过去,极其枯燥。
  1. 铁器时代(IDE Snippets):配置soutpsvm等快捷键。
  • 缺点:只能解决行级重复,解决不了文件级、模块级的重复。
  1. 工业时代(Schema Driven Dev):定义一份元数据(Schema),让机器自动生成所有分层代码。

我们的目标是第 3 层。核心难点在于:如何设计一个“万能模具”,既能生成代码,又不覆盖我后续手写的自定义逻辑?


三、原理图解:自动代码生成流水线

我们要构建一个轻量级的流水线,输入是“表结构”或“定义文件”,输出是“可运行的代码”。

提取元数据

继承/隔离

人工扩展

输入源: SQL DDL / JSON Schema

解析器 Parser

中间上下文 Context

注: 含类名/字段/类型/注释

渲染引擎 Jinja2

模板: Controller

模板: Service

模板: DAO/Mapper

生成: ProductController

生成: ProductMapper.xml

生成: ProductService

BaseService 机器生成

ServiceImpl 人工手写

架构设计重点:注意右下角的“隔离策略”。成熟的生成器绝不能直接覆盖用户写代码的文件。通常采用Base 类(生成) + Impl 类(继承/组合,手写)的模式,或者Hook 模式


四、核心代码实现:Python + Jinja2 实战

这里以Go 语言 Web 开发为例(Java/Python 同理),演示如何通过一个 YAML 配置文件,自动生成 Struct、Repository 和 Service。

1. 准备工作

安装 Python 依赖:
pip install jinja2 pyyaml

2. 定义元数据 (product.yaml)

这是我们唯一需要手写的东西,描述业务模型。

model:name:"Product"table_name:"t_product"comment:"商品信息表"fields:-name:"ID"type:"int64"json:"id"db:"id"comment:"主键"-name:"Name"type:"string"json:"name"db:"name"comment:"商品名称"-name:"Price"type:"float64"json:"price"db:"price"comment:"价格"

3. 编写模板 (model.go.tpl)

使用 Jinja2 语法,这比任何硬编码的字符串拼接都好维护。

packagemodel// {{ model.comment }}type{{model.name}}struct{{%forfield in model.fields%}{{field.name}}{{field.type}}`gorm:"column:{{ field.db }}" json:"{{ field.json }}"`// {{ field.comment }}{%endfor%}}// TableName 映射表名func({{model.name}})TableName()string{return"{{ model.table_name }}"}

4. 编写生成脚本 (gen.py)

这是流水线的引擎。

importyamlfromjinja2importTemplateimportosdefgenerate_code(yaml_file,template_file,output_file):# 1. 读取元数据withopen(yaml_file,'r',encoding='utf-8')asf:data=yaml.safe_load(f)# 2. 读取模板withopen(template_file,'r',encoding='utf-8')asf:tpl_content=f.read()template=Template(tpl_content)# 3. 渲染# 这里可以注入一些辅助函数,比如驼峰转下划线等rendered_code=template.render(model=data['model'])# 4. 输出文件withopen(output_file,'w',encoding='utf-8')asf:f.write(rendered_code)print(f"✅ 成功生成:{output_file}")if__name__=="__main__":# 实战中这里通常会遍历整个目录generate_code('product.yaml','model.go.tpl','product.model.go')

运行结果:
执行python gen.py,你将瞬间得到一个标准规范、带注释、带 Tag 的 Go 结构体文件。


五、性能 / 稳定性 / 优化分析

虽然是生成代码,但如果不注意细节,生成的代码就是“屎山”。

关注维度潜在坑点优化方案
可维护性每次重新生成都会覆盖我手写的逻辑(例如FindByNameGap Pattern(缝隙模式):生成两个文件,gen_model.go(只读,机器生成)和model.go(手动维护,继承前者或组合前者)。脚本只覆盖gen_开头的文件。
类型映射数据库的tinyint转成 Go 是int8还是bool在解析器层建立TypeMapper 字典,统一处理 SQL 类型到编程语言类型的转换,避免硬编码。
格式化生成的代码缩进乱七八糟,Git Diff 很难看生成后自动调用gofmt(Go) 或google-java-format(Java) 或Black(Python) 进行格式化,保证代码美观。

进阶技巧:反向工程
不要手写 YAML。最高效的方式是:
DB --> SQLParser --> Context --> Code
直接连接开发库,读取information_schema,一键生成整个数据库的所有 CRUD 代码。


六、实战案例复盘:重构老旧管理后台

背景:
我们要为一个遗留系统开发一个新的运营后台,涉及 30 张表。团队只有 2 个人,工期 5 天。

传统做法:
一个人负责 15 张表,平均每张表写 Controller/Service/DAO 需要 2 小时(含联调)。
Total = 30 * 2 = 60 小时。2 个人需要不吃不喝干 4 天,最后 1 天联调,大概率延期。

Script + Template 做法:

  1. Day 1 上午:花 3 小时设计数据库表结构。
  2. Day 1 下午:编写/调整 Python 生成脚本,适配公司的 Result 包装结构和异常处理规范。
  3. Day 1 晚上:运行脚本,5 秒钟生成了 30 张表的 CRUD 基础代码(含增删改查 API、分页查询)。
  4. Day 2 - Day 4:两人专注于处理 20% 的特殊业务逻辑(如:订单状态流转、复杂的报表统计)。
  5. Day 5:测试上线。

结果:
代码风格极其统一(全是脚本生成的),Bug 率极低(模板没问题,代码就没问题),提前 1 天完工。


七、经验总结:架构师的 5 条建议

  1. Don’t Repeat Yourself (DRY):不仅是代码逻辑不重复,写代码的动作也不要重复。凡是出现第三次的机械操作,必须脚本化。
  2. 模板即规范:把团队的代码规范写进 Jinja2 模板里。新人入职,让他运行脚本生成代码,他写出来的代码就和架构师的一模一样。
  3. 生成的代码要是“可编译的”:不要生成半成品。脚本跑完,IDE 里应该没有红线,项目应该能直接启动。
  4. 慎用重量级 ORM 生成器:Hibernate 或 MyBatis Generator 往往配置繁琐且难以定制。自写 Python 脚本通常只需 100 行代码,灵活度却高十倍。
  5. 保持敬畏:自动化是手段,不是目的。对于核心复杂的业务域(Domain),依然需要你精雕细琢的手写代码,别试图生成一切。

从今天开始,试着写一个脚本,把你手头那个讨厌的 CRUD 模块生成出来。你会发现,剩下的时间用来划水摸鱼……啊不,用来学习源码,是多么香!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:53:36

手把手教你学Simulink——电机电磁兼容与可靠性场景示例:基于Simulink的电机轴承润滑优化仿真

目录 手把手教你学Simulink 一、引言:为什么“电机温升不高,但轴承却干磨烧毁”?——润滑失效是可靠性黑洞! 二、轴承润滑失效机理:从油脂到卡死的退化链 润滑脂功能三要素: 失效路径: 关键指标: 三、应用场景:电动汽车驱动电机的长寿命轴承设计 系统需求 四…

作者头像 李华
网站建设 2026/4/18 8:04:36

学霸同款2026 AI论文软件TOP9:继续教育写作全攻略

学霸同款2026 AI论文软件TOP9:继续教育写作全攻略 2026年学术写作工具测评:为继续教育人群量身打造 在当前继续教育日益普及的背景下,越来越多的学习者需要借助AI工具提升论文写作效率。然而,市面上的AI论文软件种类繁多&#xff…

作者头像 李华
网站建设 2026/4/18 9:50:17

联合收割机传动部件设计

2 农用联合收割机总方案设计 2.1 收割机工作原理及组成部分 首先,机器必须实现连续切割,脱粒和清洁小麦的功用[19]。根据小麦植株的生长特性,此机器设备选取中间带有进料轮的滚筒脱粒的系统。稻谷首先在钉桶中运输。由于转鼓对谷物的撞击速度…

作者头像 李华
网站建设 2026/4/18 12:32:56

电脑重复文件怎么找?2026年最新最全的查找与清理教程

是不是总觉得电脑空间莫名其妙就没了,C盘动不动就飘红警告?下载的文件、保存的照片、微信接收的资料,不知不觉中就存了好几份,它们像“隐形”的垃圾一样,悄悄吞噬着你的硬盘空间,拖慢电脑运行速度。其实&am…

作者头像 李华
网站建设 2026/4/18 6:30:30

GLM Coding Plan 在 TRAE 中的使用教程(效率提升实战)

GLM Coding Plan 在 TRAE 中的使用教程(效率提升实战) 关键词:GLM Coding 教程、TRAE 使用方法、GLM-4.7 配置指南、AI 编程工具推荐、智能 IDE 实战 GLM Coding Plan 体验卡入口: https://www.bigmodel.cn/glm-coding?ic9FFMZ…

作者头像 李华