go模板-代碼生成器

能用程序去作的事,就不要用手,編寫本身的代碼生成器就是用來解放你的雙手,替你作一些重複性的工做。 上篇帖子寫了模板的基礎 go模板詳說 ,有了基礎就要作點什麼東西,把所學到的東西應用起來才能更好的進步。因而用模板寫了一個代碼生成器,用於把數據庫的錶轉換成gostruct,目前支持MySQLPostgreSQL。這篇帖子寫實現的思路和一些具體的代碼實現。
Github地址: yggdrasill
看一下效果 html

大概的思路:git

  • 就是獲得數據庫下的全部的表數據。若是指定生成某幾個表,只需查一下是否存在相應的表。
  • 根據表名獲得列信息,而後根據列的類型轉換成go的類型,若是有自定的類型要作特殊處理。
  • 利用模板把表的數據轉換成結構體

組織元數據

這裏的元數據也就是數據庫的表信息,因爲MySQLPostgreSQL獲得表和列信息的實現方式不一樣,可是最終的數據結構是一致的,就寫了一個統一的接口來獲取元數據信息。 github

MySQL

MySQLinformation_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

PostgreSQL也是從information_schema.tables獲取表信息,不一樣的是,不須要指定數據庫的名字,但MySql須要,感受仍是PostgreSQL更合理一些,由於在鏈接數據庫的dsn裏已經指定了要操做的dbbash

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層的也實現了。

必定要用模板實現麼?固然不是,能夠用你喜歡的方式去實現,只是正好閱讀了模板的官方文檔,就用他作了實現。

Github地址: yggdrasill

相關文章
相關標籤/搜索