1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ありの~ままの~DBスキーマを、go言語ソースコードに自動変換【xorm/reverse】

Last updated at Posted at 2020-03-10

はい:clap:
今回ご紹介するのは、こちらの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/reversegit cloneしてくる

https://gitea.com/xorm/reverse にgit用URLが(githubと同じように)載っているので、ありがたくgit cloneしましょう。:pray:

$ 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.ymlmy-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"`
}

素晴らしい…:heart_eyes_cat:

ちなみに「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)
);
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?