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本体に手を入れる必要がありそうだ。