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
层的也实现了。
一定要用模板实现么?当然不是,可以用你喜欢的方式去实现,只是正好阅读了模板的官方文档,就用他做了实现。
go模板-代码生成器的更多相关文章
- Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15
Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15 1. attilax重要案例的分类(atiuse,auBackTech,bizImp)3 1.1. 两个book3 1.2. ...
- EF POWER TOOLS由数据库逆向CODE FIRST
EF POWER TOOLS由数据库逆向CODE FIRST 前言 利用db first的开发方式有很多可供选择的方案,一种可以用ado.net实体框架模型,由向导直接生成edmx,并生成数据库上下文 ...
- Java 爬虫学习
Java爬虫领域最强大的框架是JSoup:可直接解析具体的URL地址(即解析对应的HTML),提供了一套强大的API,包括可以通过DOM.CSS选择器,即类似jQuery方式来取出和操作数据.主要功能 ...
- 深入理解xLua热更新原理
热更新简介 热更新是指在不需要重新编译打包游戏的情况下,在线更新游戏中的一些非核心代码和资源,比如活动运营和打补丁.热更新分为资源热更新和代码热更新两种,代码热更新实际上也是把代码当成资源的一种热更新 ...
- 所有的代码生成器都是浮云,如果可以用aspx文件作为模板
首先申明:标题中的如果是可以去掉的. 想写这篇文章很长时间了,一来是跟大家分享一下,别浪费时间在写代码生成器上面了,什么CodeSmith,XXCodeGenerator等等,都是浮云:二来想跟大家交 ...
- MVC使用的MetaModel代码生成器模板
代码生成器能使从一些重复的工作中缓解下来 在最近开发MVC项目中使用到了MetaModel用来设定Model的显示名称,数据限制的代码生成模板,自己第一做代码生成模板还有很多缺陷. 下面是模板代码: ...
- Java快速开发平台,JEECG 3.7.7闪电版本发布,增加多套主流UI代码生成器模板
JEECG 3.7.7 闪电版本发布,提供5套主流UI代码生成器模板 导读 ⊙平台性能优化,速度闪电般提升 ⊙提供5套新的主流UI代码生成器模板(Bootstrap表单+Boots ...
- 一个简单的代码生成器(T4文本模板运用)
说要写这篇文章有一段时间了,但因为最近各方面的压力导致心情十二分的不好,下班后往往都洗洗睡了.今天痛定思痛,终于把这件拖了很久的事做了.好,不废话了,现在看看"一个简单的代码生成器" ...
- [52ABP系列] - 002、模板项目配合代码生成器开发
前言 本篇的主要内容是 52ABP SPA模板如何配合52ABP代码生成器开发项目 如果不了解 52ABP 项目请先看我的第一篇文章 [52ABP系列] - 001.SPA免费项目模版搭建教程 话不多 ...
随机推荐
- 数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
数据库从入门到精通合集(超详细,学习数据库必看) 查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表 ...
- Codeforce1311B. WeirdSort (冒泡排序)
You are given an array a of length n. You are also given a set of distinct positions p1,p2,-,pm, whe ...
- 题目分享E 二代目
题意:一棵点数为n的树,每个节点有点权,要求在树中中找到一个最小的x,使得存在一个点满足max(该点点权,该点相邻的点的点权+1,其他点的点权+2)=x 分析:首先要能把题目转化为上述题意 首先题目让 ...
- Programming Languages_05 FWAE
FWAE : Concrete syntax <FWAE> ::= <num> | {+ <FWAE> <FWAE>} | {- <FWAE> ...
- 前端——Vue-cli 通过UI页面创建项目
在使用该教程创建项目时请先安装vue ui,具体安装方法请百度 1.打开CMD,输入vue ui 2.点击创建按钮,选择项目目录 3.填写项目名 4.配置项目 选择项目所需要的模块
- 【Linux基础总结】Linux系统管理
Linux系统管理 Linux磁盘管理命令.内存查看命令讲解 系统信息 查看系统 $ uname 查看系统版本号 $ uname -r 查看cpu信息 $ cat /proc/cpuinfo 查看内存 ...
- Qt 操作sql server数据库
添加qtsql的库 连接数据库 QSqlDatabase_db = QSqlDatabase::addDatabase("QODBC"); _db.setHostName(); _ ...
- [csu/coj 1632]LCP
题意:求一个串的出现次数超过1次的字串的个数 思路:对于一个后缀,出现在它后面的所有后缀与它的LCP的最大值就是应该增加的答案,当然这里没有考虑去重,但是却转化了问题,使得我们可以用最长公共前缀来统计 ...
- Python 简明教程 --- 2,第一个Python 程序
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 如果你发现特殊情况太多,那你肯定是用错方法了. -- Carig Zerouni 当你在自己的电脑上 ...
- JQ选择器-选择符合条件的元素,获取对应关系元素
如果你想寻找id以“sub_”开头的元素,你可以使用: $("*[id^='sub_']") 如果你想寻找id以“trim”结尾的元素,你可以使用: $("*[id$=' ...