能用程序去作的事,就不要用手,编写本身的代码生成器就是用来解放你的双手,替你作一些重复性的工做。 上篇帖子写了模板的基础 go模板详说 ,有了基础就要作点什么东西,把所学到的东西应用起来才能更好的进步。因而用模板写了一个代码生成器,用于把数据库的表转换成go
的struct
,目前支持MySQL
和PostgreSQL
。这篇帖子写实现的思路和一些具体的代码实现。
Github地址: yggdrasill
看一下效果 html
大概的思路:git
go
的类型,若是有自定的类型要作特殊处理。这里的元数据
也就是数据库的表信息,因为MySQL
和PostgreSQL
获得表和列信息的实现方式不一样,可是最终的数据结构是一致的,就写了一个统一的接口来获取元数据信息。 github
MySQL
从information_schema.tables
获得一个数据库下的全部表sql
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
也是从information_schema.tables
获取表信息,不一样的是,不须要指定数据库的名字,但MySql
须要,感受仍是PostgreSQL
更合理一些,由于在链接数据库的dsn
里已经指定了要操做的db
了bash
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
相关的类型。ui
须要考虑的是是否有些类型要特殊处理,或自定义,特殊处理后的类型是否须要在
import
里加上具体的导入。spa
方法getGoType
把获得的数据库类型进行对比,返回go的类型。 code
先看一下模板的代码,里面的知识点上篇帖子都有说过
主要就是包名称、是否有import、结构体信息
import
应该是会用到的,有用到时间类型就须要import time
,还有前面说的,注意自定义的类型的导入。
还有一点就是这个Tag
,因为模板的功能还不够丰富,就彻底用方法去实现了
看一下生成的效果
也能够根据你的业务对这个库进行扩展,因为项目不让用orm
彻底手写sql
,我就根据本身的业务进行了扩展,把dao
层的也实现了。
必定要用模板实现么?固然不是,能够用你喜欢的方式去实现,只是正好阅读了模板的官方文档,就用他作了实现。