fuckdb Lite, 幫助你更快地生成go struct程式碼

hantmac發表於2020-04-06

前言&背景

在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,你就會得到下面的介面:

fuckdb Lite, 幫助你更快地生成go struct程式碼

伺服器上的資料庫

如果你的資料庫在內網伺服器上,你需要先修改後端介面的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 namestruct name,然後點選生成,就可以得到gorm對應的結構體對映。

在你的專案專案中只要 Ctrl+C&Ctrl+V 即可。我們知道golang的struct的tag有很多功能,這裡也提供了很多tag的可選項,比如json,xml等,後面會增加更多的tag可選項支援。

web版的特色功能是資料庫資訊快取功能,能夠記憶你之前填寫過的資料庫資訊,省去了大量重複的操作,你不用再填寫繁瑣的資料庫名,表名,只需一鍵,就可以得到對應的程式碼,配合附帶json-to-go外掛(github.com/mholt/json-…),開發效率得到極速提升。目前這個工具在我們組內已經開始使用,反饋比較好,節省了很多重複的工作,尤其是在開發的時候用到同一個庫的多張表,很快就可以完成資料庫表->strcut的對映。

來看一段演示視訊。

fuckdb Lite, 幫助你更快地生成go struct程式碼

插曲

前幾天有同學找上門,說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 generatefuckdb 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
複製程式碼

fuckdb Lite, 幫助你更快地生成go struct程式碼
Enjoy Your Code!

來看一段演示操作(說好一分鐘拿到程式碼,絕不超1秒)

fuckdb Lite, 幫助你更快地生成go struct程式碼

比之前的web版的安裝簡直方便了太多,媽媽再也不用擔心我加班啦。

ps: fuckdb.json檔案必須在操作目錄下。

歡迎試用&反饋&Contribute。程式碼地址:github.com/hantmac/fuc…


                                官方資訊*最新技術*獨家解讀
複製程式碼

fuckdb Lite, 幫助你更快地生成go struct程式碼

相關文章