前言&背景
在golang的開發過程中,當我們使用orm的時候,常常需要將資料庫表對應到golang的一個struct,這些struct會攜帶orm對應的tag
,就像下面的struct定義一樣:
type InsInfo struct {
Connections string `gorm:"column:connections"`
CPU int `gorm:"column:cpu"`
CreateTime time.Time `gorm:"column:create_time"`
Env int `gorm:"column:env"`
ID int64 `gorm:"column:id;primary_key"`
IP string `gorm:"column:ip"`
Organization string `gorm:"column:organization"`
Pass string `gorm:"column:pass"`
Port string `gorm:"column:port"`
RegionId string `gorm:"column:regionid"`
ServerIP string `gorm:"column:server_ip"`
Status int `gorm:"column:status"`
Type string `gorm:"column:type"`
UUID string `gorm:"column:uuid"`
}
複製程式碼
這是gorm對應的資料庫表的struct對映,即使資料表的欄位不多,如果是手動寫起來也是一些重複性的工作。像MySQL這種關係型資料庫,我們一般會用orm去運算元據庫,於是就想mysql的資料表能不能來自動生成golang 的struct定義 ,減少重複性的開發工作(早點下班)。
現狀
調研了一下目前有一些工具,比如chrome外掛SQL2Struct(一款根據sql語句自動生成golang結構體的chrome外掛),感覺用起來比較繁瑣,每次需要進入資料庫,執行SQL語句拿到建表語句copy到瀏覽器中,才能使用。在想能不能提供一個開箱即用的環境,提供web介面,我們只需要填寫資料庫資訊,就可以一鍵生成對應的ORM的struct,於是就誕生了這個專案:github.com/hantmac/fuc…
原理
mysql有個自帶的資料庫information_schema
,有一張表COLUMNS
,它的欄位包含資料庫名、表名、欄位名、欄位型別等,我們可以利用這個表的資料,把對應的表的欄位資訊讀取出來,然後再根據golang的語法規則,生成對應的struct。具體不詳細展開了,感興趣的可以去看下原始碼。
Web 版
連線本地資料庫
如果你的資料庫在本地,那麼只需要執行 docker-compose up -d
,
訪問localhost:8000
,你就會得到下面的介面:
伺服器上的資料庫
如果你的資料庫在內網伺服器上,你需要先修改後端介面的ip:port,然後重新build Docker映象,push到自己的映象倉庫,然後修改docker-compose.yaml,再執行docker-compose up -d
。修改的位置是:fuckdb/frontend/src/config/index.js
.
let APIdb2struct
if(process.env.NODE_ENV === "development"){
APIdb2struct = "http://0.0.0.0:8000" //修改為部署伺服器的ip
}else{
APIdb2struct = "http://0.0.0.0:8000" //修改為部署伺服器的ip
}
export default {
APIdb2struct
}
複製程式碼
只需要填入資料庫相關資訊,以及你想得到的golang程式碼的package name
、struct name
,然後點選生成,就可以得到gorm對應的結構體對映。
在你的專案專案中只要 Ctrl+C&Ctrl+V 即可。我們知道golang的struct的tag有很多功能,這裡也提供了很多tag的可選項,比如json
,xml
等,後面會增加更多的tag可選項支援。
web版的特色功能是資料庫資訊快取功能,能夠記憶你之前填寫過的資料庫資訊,省去了大量重複的操作,你不用再填寫繁瑣的資料庫名,表名,只需一鍵,就可以得到對應的程式碼,配合附帶json-to-go外掛(github.com/mholt/json-…),開發效率得到極速提升。目前這個工具在我們組內已經開始使用,反饋比較好,節省了很多重複的工作,尤其是在開發的時候用到同一個庫的多張表,很快就可以完成資料庫表->strcut的對映。
來看一段演示視訊。
插曲
前幾天有同學找上門,說fuckdb的web版部署後無法使用,解決了半天也沒能讓使用者部署起來,反饋過來還是感覺部署有些複雜。反思了一下,對於一個工具化的軟體,有些使用者並不想做一些複雜的部署流程或者不熟悉部署操作,可能就是想暫時使用一下,所以應該讓工具更加輕量化,更加開箱即用,於是連夜寫了一個fuckdb lite, 更容易上手使用,更方便的安裝流程,1分鐘拿到你想要的程式碼。
fuckdb Lite
原理
基於 cobra(github.com/spf13/cobra),核心程式碼繼承web版。
安裝
聽取使用者反饋,安裝流程極簡化,Mac使用者可以直接brew install 安裝
brew tap hantmac/tap && brew install fuckdb
複製程式碼
- Linux使用者:
curl https://github.com/hantmac/fuckdb/releases/download/v0.2/fuckdb_linux.tar.gz
下載、解壓、安裝 - windows使用者emmm, 就去GitHub的release手動下載吧
使用
fuckdb --help
From mysql schema generate golang struct with gorm, json tag
Usage:
fuckdb [command]
Available Commands:
generate use `fuckdb generate` to generate fuckdb.json
go fuckdb go to generate golang struct with gorm and json tag
help Help about any command
Flags:
-h, --help help for fuckdb
Use "fuckdb [command] --help" for more information about a command.
複製程式碼
目前提供了兩個主要命令,fuckdb generate
和 fuckdb go
,我們依次來看。
fuckdb generate
複製程式碼
生成一個儲存MySQL資訊的fuckdb.json
檔案,
編輯 fuckdb.json ,填寫你的MySQL資訊,該檔案可複用,簡單修改表名即可。
{
"db": {
"host": "localhost",
"port": 3306,
"password": "password",
"user": "root",
"table": "tableName",
"database": "example",
"packageName": "packageName",
"structName": "structName",
"jsonAnnotation": true,
"gormAnnotation": true
}
}
複製程式碼
修改完檔案後,就完成了準備工作,go go go!
執行
fuckdb go
複製程式碼
Enjoy Your Code!
來看一段演示操作(說好一分鐘拿到程式碼,絕不超1秒)
比之前的web版的安裝簡直方便了太多,媽媽再也不用擔心我加班啦。
ps: fuckdb.json檔案必須在操作目錄下。
歡迎試用&反饋&Contribute。程式碼地址:github.com/hantmac/fuc…
官方資訊*最新技術*獨家解讀
複製程式碼