最近友人と既存のOSSを真似て色々作っています。
全然使えたものではないけれど、その中で勉強になったこととかを書いていきたいです。基本goで書いてます。
今回作るもの
今回はredashを真似て、コマンドを実行したときに結果がテーブルのように表示できるものを作ってみました。画面は作っていないです。
$ go run main.go connect --file sample/sample.sql
{"level":"info","ts":1642549944.589237,"caller":"cmd/connect.go:76","msg":"database connected"}
+----+-------+
| ID | NAME |
+----+-------+
| 1 | test2 |
| 2 | test4 |
| 3 | test1 |
| 4 | test3 |
+----+-------+
cobraパッケージ
goでコマンド周りを使用する際に便利なパッケージです。
他にはcliというのがいますが、今回は使ったことがないcobraを使ってみることにしました。
インストールして、初期化
初期化したタイミングで、root.goファイルが作成されます。
$ go install github.com/spf13/cobra/cobra
$ cobra init --pkg-name [任意のpackage名]
サブコマンドの追加
サブコマンドを追加する場合は以下コマンドを実行するだけです。
実行したタイミングで、connect.goファイルが作成されます。
$ cobra add connect// 実行は、go run main.go connect で実行できる
オプションを付ける
仮に--file
オプションを付けたい場合は、以下の実装を付け加えることでオプションで入力した値を受け取ることが可能です。
connectCmd.PersistentFlags().String("file", "", "file option")
FieldDescriptions
今回実装している中で、pgxパッケージの FieldDescriptions というメソッドを使用しました。
FieldDescriptions を実行することで、テーブル名、カラムの中の実際の値を取得することが可能になります。
取得時の型が決められない場合などに便利かなと思います。
for rows.Next() {
fds := rows.FieldDescriptions() values, err := rows.Values()
if err != nil {
errors.WithStack(err)
}
}
tablewriterパッケージ
ターミナルでの表示を表みたいな感じで表示したいなーと思ってたときにこのtablewriterに出会いました。
めちゃくちゃ使いやすくて、表示させたいheaderとdataの配列を渡してあげるだけで下記のような表示が可能になります。
使い方は、READMEに書いてあるのをそのまま使いました。
+------+-----------------------+--------+
| NAME | SIGN | RATING |
+------+-----------------------+--------+
| A | The Good | 500 |
| B | The Very very Bad Man | 288 |
| C | The Ugly | 120 |
| D | The Gopher | 800 |
+------+-----------------------+--------+