MySQL Workbenchからsymfony+Doctrine用のschema.ymlを書き出せないかなぁとつぶやいたら@hidenorigotoさんに教えていただいたので試してみました。
http://twitter.com/#!/hidenorigoto/status/38153994970988544
MySQL Workbench schema exporter
MySQL Workbench schema exporterは、MySQL WorkbenchプラグインのMySQL Workbench Doctrine Pluginにインスパイアを受けて開発されたようです。
が、こちらのプラグインはすでにメンテされていないようです。
開発終了した理由がぞろぞろ書いてありますが、要約すると「LUAが…」ってことみたいです。
MySQL Workbench schema exporterはPHPで書かれています。MySQL Workbenchのmwbファイルを読み込んでパース、フォーマッタを指定してそれぞれの形式を書き出すようです。
ちなみにmwbファイルはZIP圧縮されたXMLです。あと、SQLite3のデータが入ってました。
注意点としてPHP 5.3以降でないと実行できません…
いつものdebian環境では5.2を使ってるので、Windows版の5.3をダウンロードしてインストールしました。
まずはexampleディレクトリに移動します。
C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example>php -v
PHP 5.3.5 (cli) (built: Jan 5 2011 20:36:18)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
example/data/にtest.mwbがあり、サンプルではこのファイルを使います。
ちなみにサンプルのEER(Enhanced Entity-Relationship) diagramはこんな感じです。
C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example>php .\doctrine1.yaml.php
<textarea cols="100" rows="50">Bureau:
tableName: mydb.bureaus
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
room:
type: string(45)
indexes:
testIndex:
fields: [room]
type: unique
options:
charset: utf8
type: InnoDB
Email:
actAs:
timestampable:
tableName: mydb.emails
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
email:
type: string(255)
users_id:
type: integer(4)
primary: true
notnull: true
relations:
User:
class: User
local: users_id
foreign: id
foreignAlias: Emails
onDelete: no action
onUpdate: no action
indexes:
fk_Emails_Users:
fields: [users_id]
options:
charset: utf8
type: InnoDB
User:
actAs:
timestampable:
tableName: mydb.users
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
name:
type: string(255)
options:
charset: utf8
type: InnoDB
UsersBureaus:
tableName: mydb.users_bureaus
columns:
users_id:
type: integer(4)
primary: true
notnull: true
bureaus_id:
type: integer(4)
primary: true
notnull: true
relations:
User:
class: User
local: users_id
foreign: id
foreignAlias: UsersBureauss
onDelete: no action
onUpdate: no action
Bureau:
class: Bureau
local: bureaus_id
foreign: id
foreignAlias: UsersBureauss
onDelete: no action
onUpdate: no action
indexes:
fk_users_bureaus_bureaus1:
fields: [bureaus_id]
options:
charset: utf8
type: InnoDB
Testtable:
tableName: mydb2.testtable
columns:
id:
type: integer(4)
primary: true
notnull: true
options:
charset: utf8
type: InnoDB
</textarea><br><br>1 MB used<br>0.055 sec needed
というわけで、リレーションやインデックスなども書きだされるようです。
HTMLのタグはdoctrine1.yaml.phpの中に書いてあるので、CLIから使うときは適当に外してください。
timestampableなどのビヘイビアに関しては、コメント欄に書くことで出力できるようです。
{d:actAs}
actAs:
timestampable:
{/d:actAs}
この仕様はちょっと微妙な気が…
created_atとupdated_atがあったらtimestampable付けるとかの方が楽だなぁ、と。
作っちゃった後の全テーブルにコメント指定して回るのはちょっと辛いので。
サーバにPHP 5.3が入っているなら、symfony taskでmwbからschema.ymlの生成と、ActAsの追加をやってしまうのがいいかな、と思いました。
うーん、個人的にはMySQL Workbench上で完結したいから、プラグインの方が便利な気はするんですけどねぇ。LUAとは言わなくてもPythonスクリプティング対応しているようなので、Pythonに書き直すとか…
この後、60テーブルほどのファイルを変換してみましたが、問題なく実行できました。
追記(2011/02/19)
注意点がいくつかあります。
というか、致命的かも。
1.NOT NULLのchar型にDEFAULT値”を入れるとNULLに変換される
これはDoctrineのbuild –sqlがおかしいかな…
column_name:
type: char(3)
notnull: true
default: ”
column_name char(3) DEFAULT NULL NOT NULLとかいう矛盾を持ったクエリが生成されます。
ちなみにvarcharは大丈夫です。
default: ”の行は削除しましょう。
2.DECIMALやFLOATの最大桁数と少数点の値が逆になる
ひどい。
例えばMySQL WorkbenchでDECIMAL(15,4)と指定したカラムがDECIMAL(4,15)と書き出されます。
column_name:
type: decimal(4,15)
notnull: true
default: ‘0.0000’
もちろん、ちゃんとMySQL Workbenchからクエリのエクスポートをしたときは15,4になります。
置換で何とか…
うーん、やっぱりMySQL WorkbenchでDBをあらかじめ作成しておいてから→doctrine:build-schema→schema.yml修正が妥当かなぁ。