xorm reverseでDBスキーマからGoのstructを生成する

golangdatabasemysql

GoのORMのxormにはxorm reverseというDBのスキーマから以下のようなテンプレートに沿ったGoのstructなどを生成するツールがある。

package {{.Model}}

import (
	{{range .Imports}}"{{.}}"{{end}}
)

{{range .Tables}}
type {{Mapper .Name}} struct {
{{$table := .}}
{{range .Columns}}	{{Mapper .Name}}	{{Type .}}
{{end}}
}

{{end}}

リポジトリにあるテンプレートにxorm用テンプレートとgo用のテンプレートが用意されているように、単体で使うこともできる。 また、テンプレートを書く言語としてもGo以外にC++もサポートしている。

xormのcmdとドライバをインストール。

$ go get github.com/go-xorm/cmd/xorm
$ go get github.com/go-sql-driver/mysql
$ xorm
Version:

    0.2.0524

様々な型のカラムを含むテーブルで試す。

$ cat schema.sql
CREATE TABLE table1 (
  n_tinyint TINYINT,
  n_int INT,
  n_int_unsigned INT UNSIGNED NOT NULL DEFAULT 1,
  n_bigint BIGINT,
  n_float FLOAT,
  n_double DOUBLE,
  d_date DATE,
  d_datetime DATETIME,
  s_char CHAR(64),
  s_varchar VARCHAR(64),
  s_text TEXT,
  s_json JSON,
  b_binary BLOB,
  e_enum ENUM('aaa', 'bbb', 'ccc')
)

$ cat setup.sh
docker run --name mysql-xorm -p 33306:3306 -e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" -e "MYSQL_DATABASE=testdb" 
while [ $(docker inspect --format "{{.State.Health.Status }}" mysql-xorm) != "healthy" ]; do printf "."; sleep 1; done
mysql -u root -h 0.0.0.0 -P 33306 -D testdb < schema.sql

$ sh setup.sh

Goのテンプレートをリポジトリから持ってきてxorm reverseを実行。

$ ls xorm-template
config		struct.go.tpl

$ xorm reverse mysql "root:@tcp(0.0.0.0:33306)/testdb" xorm-template
$ cat model/table1.go 
package model

import (
	"time"
)

type Table1 struct {
	NTinyint     int
	NInt         int
	NIntUnsigned int
	NBigint      int64
	NFloat       float32
	NDouble      float64
	DDate        time.Time
	DDatetime    time.Time
	SChar        string
	SVarchar     string
	SText        string
	SJson        string
	BBinary      []byte
	EEnum        string
}

概ねうまくいっているが、現状unsignedは無視されてしまう。 これを修正するには依存しているcoreやxorm本体に手を入れる必要がありそうだ。