小ネタです。
背景
golangでDBのスキーマからコード生成する際に、xoというものがあります。
例えばmysqlに接続してコード生成する場合は
xo schema mysql://docker:docker@127.0.0.1:3306/{dbname} --out domain/model/dbschema/
とかやると、テーブルごとにいい感じにコードが生成されます。
しかしデフォルトではstruct fieldsには json しか定義されていません。
sqlx
使って row.StructScan(&hoge)
とかやりたいなと思った時に不便です。
そこで、db field も出力出来るようにします。
やり方
--go-field-tag
オプションを指定します。
※このオプションはつい最近(2021/6/11) 実装されたものなので、適宜xoをアップデートしてください。
xo schema mysql://docker:docker@127.0.0.1:3306/{dbname} --out domain/model/dbschema/ --go-field-tag='`json:"{{ .SQLName }}" db:"{{ .SQLName }}"`'
備考
テンプレについて
おまじないのように書いた json:"{{ .SQLName }}" db:"{{ .SQLName }}"
は、
ここで指定されています。
きっと他にも展開できる変数が有るのだと思いますが、未調査です。
mysql:8について
その他xoのハマりどころとして、現時点では mysql:8
に接続してコード生成した場合、
auto_incrementなカラムの Insert()
が そのカラムも指定必須になってしまいます。
ですのでコード生成時には mysql:5
に一旦落としてあげると良いです。