nakamura244 blog

所属団体とは関係なく、個人的なblog

golangのxoを導入を決めてファイルの運用方法がいい感じになってきたので書いておく

はじめに

最近はgolangでアプリケーションを書いていてmodel周りにはxoというtoolを使ってmodelファイルを自動生成している

GitHub - xo/xo: Command line tool to generate idiomatic Go code for SQL databases supporting PostgreSQL, MySQL, SQLite, Oracle, and Microsoft SQL Server

自動生成されるモデル、自動生成用に使うテンプレートファイル、xo自体をどうやって管理運用しているかを残しておく

xo

xoを活用しているリポジトリではdepでvendor配下に利用するライブラリを管理している。そのノリでvendor配下にxoも入れようかと思ったけど、ロジックを実装する上では使う事の無いライブラリとなっている。

  1. ロジックを組むのに直接的に利用しないライブラリが、リポジトリのvendorにいる違和感。
  2. golang自体のバージョンを今後あげて行く上で依存するvendorを少しでもスリムにしときたい。

という理由からxoはグローバル領域にgetすることにした

自動生成されるファイル、自動生成用のtemplate

これらはgit管理化に置いてcommitしている

こんな感じ

./datasources/mysql
|-- driver.go
|-- driver_test.go
|-- models  // xoによって自動生成されたmodelはこのディレクトリに格納
|   |-- xxx.xo.go
|   |-- xxx.go
|   |-- xxx_test.go
|   `-- xo_db.xo.go
`-- xo
    `-- templates // globalにinstallしたxoのテンプレートファイル一式をここに格納(使っていないDBのtemplateも入れてしまっている)
        |-- xxx.go.tpl
  • xxx.xo.goというのがxoから自動生成されたファイル。(オプションでこのファイル名は変えれる)
    • これらのファイルには手動で変更を加える事は基本的になし
  • 自動生成されたxxx.xo.goのメソッドだけでは事足りない場合がある。その時は同じディレクトリ(=同じpackage内)にxxx.goファイルを追加してメソッドを追加している
    • ex:他のtableとjoinしてデータを取りたい時とかは自分で追加している
  • 自動生成に使うtemplateは随時都合が良いように変更・履歴を残したいのでgit管理下においた

tableスキーマに変更があった場合

xoを使ってxxx.xo.goファイルを再生成してプルリクをつくる

-> xxx.xo.goファイルだけのdiffのプルリクになる

自動生成されるメソッドの形式を変えたかったりする場合

テンプレートファイルを変更し、xoを使ってxxx.xo.goファイルを再生成してプルリクをつくる

-> templateファイルとxxx.xo.goファイルだけのdiffのプルリクになる

ちょっとだけ気になってる事

  • 特定のtableだけ対象にしてmodelファイルをgenerateできる用にしたいなーと思っている
  • xo自体のレポジトリ内でreleaseタグ運用を入れて欲しい
    • CONTRIBUTINGファイルを置いて欲しい

最後

自分が担当しているプロジェクトではちょっと合わなかった所は別でまとめるとして下記の所感

  • tableに対になるstructの定義とかが自動生成されるのはありがたい。
    • 毎回手動でやると間違った型定義しちゃう時あるし、tableスキーマが頻繁に変わるプロジェクトのフェーズだと特にありがたみを感じている
    • xoから生成されたメソッドでselectすれば、indexが効いたselectになるので無駄な地雷を踏むことがないので助かってる