能用程序去做的事,就不要用手,编写自己的代码生成器就是用来解放你的双手,替你做一些重复性的工作。

上篇帖子写了模板的基础 go模板详说 ,有了基础就要做点什么东西,把所学到的东西应用起来才能更好的进步。于是用模板写了一个代码生成器,用于把数据库的表转换成gostruct,目前支持MySQLPostgreSQL。这篇帖子写实现的思路和一些具体的代码实现。

Github地址: yggdrasill

看一下效果

大概的思路:

  • 就是得到数据库下的所有的表数据。如果指定生成某几个表,只需查一下是否存在相应的表。
  • 根据表名得到列信息,然后根据列的类型转换成go的类型,如果有自定的类型要做特殊处理。
  • 利用模板把表的数据转换成结构体

组织元数据

这里的元数据也就是数据库的表信息,由于MySQLPostgreSQL得到表和列信息的实现方式不同,但是最终的数据结构是一致的,就写了一个统一的接口来获取元数据信息。

MySQL

MySQLinformation_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层的也实现了。

一定要用模板实现么?当然不是,可以用你喜欢的方式去实现,只是正好阅读了模板的官方文档,就用他做了实现。

Github地址: yggdrasill

go模板-代码生成器的更多相关文章

  1. Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15

    Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15 1. attilax重要案例的分类(atiuse,auBackTech,bizImp)3 1.1. 两个book3 1.2. ...

  2. EF POWER TOOLS由数据库逆向CODE FIRST

    EF POWER TOOLS由数据库逆向CODE FIRST 前言 利用db first的开发方式有很多可供选择的方案,一种可以用ado.net实体框架模型,由向导直接生成edmx,并生成数据库上下文 ...

  3. Java 爬虫学习

    Java爬虫领域最强大的框架是JSoup:可直接解析具体的URL地址(即解析对应的HTML),提供了一套强大的API,包括可以通过DOM.CSS选择器,即类似jQuery方式来取出和操作数据.主要功能 ...

  4. 深入理解xLua热更新原理

    热更新简介 热更新是指在不需要重新编译打包游戏的情况下,在线更新游戏中的一些非核心代码和资源,比如活动运营和打补丁.热更新分为资源热更新和代码热更新两种,代码热更新实际上也是把代码当成资源的一种热更新 ...

  5. 所有的代码生成器都是浮云,如果可以用aspx文件作为模板

    首先申明:标题中的如果是可以去掉的. 想写这篇文章很长时间了,一来是跟大家分享一下,别浪费时间在写代码生成器上面了,什么CodeSmith,XXCodeGenerator等等,都是浮云:二来想跟大家交 ...

  6. MVC使用的MetaModel代码生成器模板

    代码生成器能使从一些重复的工作中缓解下来 在最近开发MVC项目中使用到了MetaModel用来设定Model的显示名称,数据限制的代码生成模板,自己第一做代码生成模板还有很多缺陷. 下面是模板代码: ...

  7. Java快速开发平台,JEECG 3.7.7闪电版本发布,增加多套主流UI代码生成器模板

    JEECG 3.7.7 闪电版本发布,提供5套主流UI代码生成器模板 导读 ⊙平台性能优化,速度闪电般提升           ⊙提供5套新的主流UI代码生成器模板(Bootstrap表单+Boots ...

  8. 一个简单的代码生成器(T4文本模板运用)

    说要写这篇文章有一段时间了,但因为最近各方面的压力导致心情十二分的不好,下班后往往都洗洗睡了.今天痛定思痛,终于把这件拖了很久的事做了.好,不废话了,现在看看"一个简单的代码生成器" ...

  9. [52ABP系列] - 002、模板项目配合代码生成器开发

    前言 本篇的主要内容是 52ABP SPA模板如何配合52ABP代码生成器开发项目 如果不了解 52ABP 项目请先看我的第一篇文章 [52ABP系列] - 001.SPA免费项目模版搭建教程 话不多 ...

随机推荐

  1. 演示:配置日志发送到syslog日志服务器

    演示目标:配置网络环境中的交换机和路由器将日志发送到syslog日志服务器. 演示环境:如下图10.54所示的演示环境. 演示背景:要求部署网络中的syslog服务器,集中的收集交换机S1和路由器R1 ...

  2. strip()的正则表达式版本

    题目:写一个函数,它接受一个字符串,做的事情和 strip()字符串方法一样.如果只 传入了要去除的字符串,没有其他参数,那么就从该字符串首尾去除空白字符. 否则,函数第二个参数指定的字符将从该字符串 ...

  3. C++获取当前系统时间并格式化输出

    C++中与系统时间相关的函数定义在头文件中. 一.time(time_t * )函数 函数定义如下: time_t time (time_t* timer); 获取系统当前日历时间 UTC 1970- ...

  4. 图论--2-SAT--暴力染色法求字典序最小模版

    #include <cstdio> #include <cstring> #include <stack> #include <queue> #incl ...

  5. 经过踩坑,搭建成功的Appium自动化测试环境

    因为最近本人准备搞app自动化,所以就搭建环境过程记录下来(主要踩过好几个坑) 期间有点烦躁,后面调整了下心态还是成功弄好了. 一.Appium环境搭建准备软件 所需要到的软件如下: 1.安装JDK1 ...

  6. 跟哥一起学python(2)- 运行第一个python程序&环境搭建

    本节的任务,是完成我们的第一个python程序,并搭建好学习python的环境.  建议通过视频来学习本节内容: 查看本节视频 再次看看上一节提到的那张图,看看作为高级编程语言,我们如何编程. 首先, ...

  7. PLAI那些事_07 FAE with Deferred Substitution

    FAE-parse : 一成不变 FAE-Value : interp的最终转让值 ;;numV: value ;;closureV: param-FAE(或value,或function) pair ...

  8. etcd环境安装与使用

    etcd简介 etcd是开源的.高可用的分布式key-value存储系统,可用于配置共享和服务的注册和发现,它专注于: 简单:定义清晰.面向用户的API(gRPC) 安全:可选的客户端TLS证书自动认 ...

  9. Ubuntu 1804 安装xmind8详细过程

    安装比较简单, 折腾了很久,一启动就报错,切换了JDK版本就能用了: 安装 登陆官网,下载xmind8: 下载得到文件xmind-8-update9-linux.zip: 将文件解压至路径xmind下 ...

  10. 转载-git使用之忽略不需要上传的文件的几种方式

    在我们使用git 的时候通常会遇到一些问题,一些文件我创建了但是我并不想上传或者有些文件我修改了但是并不想上传(为了适应个自己的开发环境),但是在每次git status的时候总能看到它,不仅感到很心 ...