背景
1.现有的go语言项目的开发模式和开发规范,对一张表进行增删改查操作时,需要在不同层封装不同的结构,同时在层与层交互的时候,需要编写相关的setter方法来转换不同层之间的结构。
2.现在的logic层和db层融合在一起,在对新表操作的时候,需要从0开始编写相关sql语句。
所以基于以上两点,在做项目迁移和有新表创建的需求中,不可避免的要编写这部分代码。
对已有逻辑的统计,平均对一张表做增删改查操作,大概会新创建10个文件,编写上述两部分代码大约600~900左右的代码(视表结构大小而定)。
假如一个比较复杂的需求里面有十张表。。。那上述两部分的代码开发量可想而知。
解决思路
如果对几个目前已经存在的需求,再结合目前Seller Platform的GO项目规范,就可以发现,一个请求从Router层开始到DB Model层,经过的路径是这样的:
Router → View (含有Req,Resp结构和对应的setter 方法,view层函数)→ Logic(含有逻辑层结构体、gorm 数据库操作语句函数、 setter方法。) → DB Model (db 结构体)
1.通过分析可以发现,理想情况下,可以通过数据库的表结构及对应的column信息,生成上述各层中的结构体。
2.同时预置对该表的增删改查操作,虽然实际的业务肯定不会这么简单,但是这些基本的操作和结构体都是必不可少的。
3.对特殊逻辑进行一定的定制化处理转换,如添加时不需要传入id,添加和修改时自动生成ctime,mtime,operator根据端参数从用户信息获取、删除和查询操作会判断status!=3且必须存在等。
实际实现方案
1.输入需要自动生成的数据库名+表名,以及项目结构的业务代码上级路径。
2.根据show columns from xxx 获取表中的列信息。
3.根据上述信息(如字段的名称、类型,长度、是否为空)生成对应go结构体。
4.预置最基本的增删改查操作。做到能在生成的代码的基础上进行二次开发,省去生成的代码部分的工作量。
Miscellaneous中的实践
对feedback表自动生成相关代码
共计修改2个文件,创建10个文件,代码613行
项目地址
--
未来优化点
1.可以根据project_dir直接生成对应的文件到项目中各个层的文件夹下,省去创建文件复制代码的操作。(已完成)
2.可以同时生成对应的单元测试代码,方便自测。
3.现在的req参数中的参数校验,只加了是否必须的校验和大于0(对于string则是长度大于0)的校验,未来可以根据数据的varchar 解析和具体go 数据类型进行精准校验。
4.目前使用该项目生成的数据表,假定表中含有_status,ctime,mtime字段。如果表中没有含有相关字段。还需要进行少量的删除修改才能编译通过。未来考虑对这三个字段进行判断及兼容。
...