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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM