zoukankan      html  css  js  c++  java
  • go模板-代码生成器

    能用程序去做的事,就不要用手,编写自己的代码生成器就是用来解放你的双手,替你做一些重复性的工作。
    上篇帖子写了模板的基础 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

  • 相关阅读:
    IOS笔记-C语言中的字符串数组 指针
    IOS笔记-C语言中的指针与数组
    Entity Framework 知识点总结
    提升代码内外部质量的22条经验(转载)
    WPF 第一个创建的窗体会作为Application.Current.MainWindow
    重构的十个小技巧(转)
    WPF DataGrid自定义分页控件_实现下拉刷新数据
    使用qt生成安卓android运用
    关于开发省流量手机游戏的一些建议
    c++ com 在c#项目里面使用简单例子
  • 原文地址:https://www.cnblogs.com/li-peng/p/12972016.html
Copyright © 2011-2022 走看看