go模板-代码生成器
能用程序去做的事,就不要用手,编写自己的代码生成器就是用来解放你的双手,替你做一些重复性的工作。
上篇帖子写了模板的基础 go模板详说 ,有了基础就要做点什么东西,把所学到的东西应用起来才能更好的进步。于是用模板写了一个代码生成器,用于把数据库的表转换成go
的struct
,目前支持MySQL
和PostgreSQL
。这篇帖子写实现的思路和一些具体的代码实现。
Github地址: yggdrasill
看一下效果
大概的思路:
- 就是得到数据库下的所有的表数据。如果指定生成某几个表,只需查一下是否存在相应的表。
- 根据表名得到列信息,然后根据列的类型转换成
go
的类型,如果有自定的类型要做特殊处理。 - 利用模板把表的数据转换成结构体
组织元数据
这里的元数据
也就是数据库的表信息,由于MySQL
和PostgreSQL
得到表和列信息的实现方式不同,但是最终的数据结构是一致的,就写了一个统一的接口来获取元数据信息。
MySQL
MySQL
从information_schema.tables
得到一个数据库下的所有表
select table_name from information_schema.tables where table_schema = ? and table_type = 'base table';
如果只想查询指写的表,只需添加table_name in
查询条件就行。
表的列信息从information_schema.columns
获取
select column_name, is_nullable, if(column_type = 'tinyint(1)', 'boolean', data_type), column_type like '%unsigned%' from information_schema.columns where table_schema = ? and table_name = ? order by ordinal_position;
PostgreSQL
PostgreSQL
也是从information_schema.tables
获取表信息,不同的是,不需要指定数据库的名字,但MySql
需要,感觉还是PostgreSQL
更合理一些,因为在连接数据库的dsn
里已经指定了要操作的db
了
select table_name from information_schema.tables where table_schema = 'public';
表的列信息从information_schema.columns
获取
select column_name, is_nullable, data_type, false
from information_schema.columns where table_schema = 'public' and table_name = $1 order by ordinal_position;
类型转换
从数据库里获取完表和列的信息后,就要把数据库的类型转换成go
相关的类型。
需要考虑的是是否有些类型要特殊处理,或自定义,特殊处理后的类型是否需要在
import
里加上具体的导入。
方法getGoType
把得到的数据库类型进行对比,返回go的类型。
模板
先看一下模板的代码,里面的知识点上篇帖子都有说过
主要就是包名称、是否有import、结构体信息
import
应该是会用到的,有用到时间类型就需要import time
,还有前面说的,注意自定义的类型的导入。
还有一点就是这个Tag
,由于模板的功能还不够丰富,就完全用方法去实现了
看一下生成的效果
也可以根据你的业务对这个库进行扩展,由于项目不让用orm
完全手写sql
,我就根据自己的业务进行了扩展,把dao
层的也实现了。
一定要用模板实现么?当然不是,可以用你喜欢的方式去实现,只是正好阅读了模板的官方文档,就用他做了实现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构