首頁 > 科技

CRUD 還能這麼玩?

2021-06-12 11:29:09

作者 | Kaku 責編 | 歐陽姝黎

作為一名有多年經驗的 CRUD 工程師,在做某項目時,需要在搭建完 apiserver 框架以及 dao 部分,三下五除二的就把 apiserver 部分搞定了,然後到了 dao 部分。想了想網上肯定有現成的工具可以自動生成 go struct,於是在網上找了找,果不其然,很多,但基本都是根據 table 來自動生成 go struct 的,於是搞定了創建 table 的 sql,創建完 table 之後順利的用工具生成了 go struct。

你以為這就完了嗎?

當然沒有,因為在此過程中我發現了一個 BUG 級的項目:https://github.com/smallnest/gen,點開作者主頁一看,原來又是一位自己關注已久的博主:鳥窩,肅然起敬。

項目介紹

這個項目能幹什麼呢?簡單來說就是他可以根據你的資料庫自動生成 go struct 及 dao 層、api 層,直接生成一套可運行的 restful api 項目,而且還搭配了 swagger 文件。拋開最終生成的程式碼不說,單就這個思想就已經夠我們學習了。

接下來簡單介紹下這個項目,為啥簡單介紹呢,因為使用起來確實很簡單,而且其文件說明比較完善。

安裝

項目採用 golang 編寫,生成的也是 golang 程式碼,安裝方式自然也是 golang 項目的安裝方式

go get -u github.com/smallnest/gen

使用

在項目程式碼的 example 資料夾下存在一個 sample.db 檔案,可以直接根據這個檔案來生成完成的項目,當然也支援自定義配置來生成自己需要的部分。

## 根據sample.db生成項目程式碼$ gen --sqltype=sqlite3   --connstr "./sample.db"   --database main   --json   --gorm   --guregu   --rest   --out ./example   --module example.com/rest/example   --mod   --server   --makefile   --json-fmt=snake   --generate-dao   --generate-proj   --overwrite
## 編譯 (使用make命令進行編譯,packr2會被自動安裝)$ cd ./example$ make example
## 二級制位置./bin/example$ cp ../../sample.db .$ ./example

## 開啟瀏覽器訪問這裡 http://127.0.0.1:8080/swagger/index.html
## 同樣可以使用命令列工具進行訪問curl http://localhost:8080/artists

可能會報錯,提示找不到某些檔案或者包,安裝即可,部分檔案判斷方式是直接檢查 GOPATH 下是否存在,所以會出現使用 go mod 模式時 get 下來之後仍然報錯的情況,可以直接到 GOPATH 下下載對應的項目即可。

是不是 so easy,只需要提供資料庫即可生成完整項目,但是他的功能不止於此。因為每個人有自己的習慣的編碼風格,自動生成的程式碼不可能滿足所有人的需求,那怎麼辦呢?

高階功能

gen 支援自定義模板,可以把原模板匯出,基於其修改,或者乾脆按照自己的風格製作一套模板,通過 --templateDir= 參數指定自己的模板的路徑即可

如果只想進行簡單改動,可以嘗試 --exec= 參數,允許開發者自定義程式碼生成規則,在項目自帶的 custom 資料夾下有 sample.gen 檔案,可以直接指定 --exec=sample.gen 看執行效果,如果使用的是最新的 master,則執行會報錯,看程式碼可以發現在 2020/8/4 的一次修改,改變了某些方法的形參,而 sample.gen 沒有進行對應修改,按需修改即可。

原理

項目用到的主要的技術就是 golang 的 template 功能,包括 template 的常用能力及定製函數等功能。另外包括 GIN 框架、GORM 框架等 crud 工程師們常用的包。裡面還有一個平時不怎麼用的包 packr,其主要功能就是把靜態檔案嵌入到最終生成的二進位制檔案中,程式就可以在任何位置直接運行而不需要受制於額外靜態檔案的位置等因素。

結束語

被 CRUD 折磨的人啊,是否有考慮過將其自動化呢,雖然業務邏輯是在變化的,但項目框架部分是基本保持不變的,搞一套自己習慣的開箱即用框架豈不是更美,畢竟從頭寫的話也需要一點時間,懶果然是人類進步的階梯,趕緊去下載項目試一試吧。


IT145.com E-mail:sddin#qq.com