はい
今回ご紹介するのは、こちらのxorm/reverse
です。
https://gitea.com/xorm/reverse
なんと!
DBのテーブル構造を直接見に行って、go言語の構造体ソースコードに自動変換してくれます。
対象DB種類も、MySQL以外に色々対応しています。
ライセンスは、MITかな?
LICENSEファイルには明示的には書いてないですが、xorm公式ページではMITとなっているので。
https://xorm.io/
こちら、実は2年以上前から開発されているようです。
以前はリポジトリはgithubだったんですが、親プロジェクトxorm
と共にgiteaに移籍したみたいですね。
また当時のバージョンではC言語や他の言語ソースへもリバースできたんですが、リニューアル以降はまだlanguage/golang.go
以外の出力プラグインは作られてないみたいですね。
パブリックリポジトリなので、gitea のアカウントを持ってなくてもマイPCからgit cloneできました。
ただ、EC2インスタンスからのgit cloneは失敗しました。AWSはブロックしてるのかしら?
ままエアロ。
使い方
・・・をご紹介しようと思ったのですが、早速失敗しました。
READMEどおり
$ go get xorm.io/reverse
したら
# xorm.io/reverse/vendor/github.com/mattn/go-sqlite3
exec: "gcc": executable file not found in %PATH%
gcc
がインストールされてないと動かない、と。
gcc
入れるのダルいなー。
それとちょっと改造する用事もあったので、git clone
してソースをいじってxorm/reverse
のmainコードを直接実行するようにしちゃいましょう。
(下準備)リバース対象のお試しMySQLを用意
https://github.com/yagrush/simple-docker-mysql
↑こちらに、docker-compose
ですぐ起動できるお試しMySQLをご用意しました。
これをgit clone
して起動します。
※ docker-compose
自体の設定は割愛します。
あるいはAWS EC2用でよろしければ、こちら https://qiita.com/yagrush/items/e85d2da1b0ef9997fa07 をご参照ください。
$ cd ~
$ git clone https://github.com/yagrush/simple-docker-mysql.git
$ cd simple-docker-mysql
$ docker-compose up --build -d
xorm/reverse
実行を試みる
xorm/reverse
をgit clone
してくる
https://gitea.com/xorm/reverse にgit用URLが(githubと同じように)載っているので、ありがたくgit clone
しましょう。
$ cd ~
$ git clone https://gitea.com/xorm/reverse.git
$ cd reverse
sqlite3 を対応DBから外す
sqlite3は今回使わないし、
gcc見つからないエラー
をちゃっちゃと回避したいので、↓をコメントアウトしちゃいます。
-
go.mod
require宣言のgithub.com/mattn/go-sqlite3
-
main.go
import宣言の_ "github.com/mattn/go-sqlite3"
reverse
設定ファイルを作る
reverse/examples/goxorm.yml
を my-mysql.yml
に改名して、プロジェクトルート reverse/
にコピーします。
そして、中身を適宜編集します。
例えばこんな感じ。
kind: reverse
name: my-mysql
source:
database: mysql
conn_str: 'root:hogerootpassword@tcp(127.0.0.1:3306)/hogedb'
targets:
- type: codes
include_tables:
- hogetable
exclude_tables:
- foo
language: golang
template_path: example/template/goxorm.tmpl
output_dir: models
実行
早速実行してみます。
$ cd reverse
$ go run main.go -f my-mysql.yml
$
何も表示されないですが、エラーもないし、どうやら無事実行されましたかね。
出力を見てみましょう。
設定ファイルに output_dir: models
と書いていたので、これかな?
$ cat models/models.go
package models
type Hogetable struct {
Hogename string `xorm:"not null VARCHAR(32)"`
Id int `xorm:"not null pk autoincr INT"`
}
素晴らしい…
ちなみに「package models
はいったいどこから来てん?」というと、
↓設定ファイルから参照しているテンプレートファイルgoxorm.tmpl
にあります。
template_path: example/template/goxorm.tmpl
これをいじれば、さらにカスタマイズできます。
あと、構造体のフィールドに xorm:
タグがおまけで付いてますね。
これはxorm/reverse
の親プロジェクトでもある、オープンソースORMxorm
用みたいですね。
ちなみにリバース対象にしたDBスキーマは↓こんな感じです。
(上の方でご紹介したお試しセットまんまです)
CREATE DATABASE IF NOT EXISTS hogedb;
use hogedb;
CREATE TABLE hogetable (
id INT NOT NULL AUTO_INCREMENT,
hogename VARCHAR(32) NOT NULL,
PRIMARY KEY (id)
);