業務でも使ってみて問題なさそうな感じなので v0.6.4 をリリースしました。
github.com
主な変更点は以下の通りです。
- Add
--use-external-script
option
- Add
--mysql-use-alter
option
- Add
--alter-extra
option
- Add
--dump-with-default-fk-name
option
- Support
t.index
- Remove migration_comments support
- Fix fk apply order
--use-external-script / --mysql-use-alter
以前の記事にも書きましたが、--use-external-script
は外部スクリプトで変更を実施するためのオプションです。
https://github.com/winebarrel/ridgepole#execute-sql-using-external-script
$ cat test.sh
SQL="$1"
CONFIG_JSON="$2"
echo "$SQL" | mysql -u root my_db
$ ridgepole -c config.yml --apply --external-script ./test.sh
変更を適用するときに、SQLを外部のスクリプトに渡すことができるようになります。
--mysql-use-alter
はそれに関連して、CREATE/DROP INDEXの代わりにALTER TABLEを使うようになるオプションです。
この方が外部スクリプトでのパースが楽なので…
業務では、CIで「実行時間長すぎ」と言われたクエリについては、自動的に「pt-oscでクエリを実行する」スクリプトを出力して、それを手動実行みたいなことをやっています。がんばればpt-oscで勝手に適用、とかまでできると思いますが、そこまでやったことはないです。
--alter-extra
--alter-extra
はMySQLのALRER文にLOCK=NONEとかつけるためのオプションです。
https://github.com/winebarrel/ridgepole#add-extra-statement-to-alter
$ ridgepole -a -c database.yml --alter-extra="LOCK=NONE" --debug
Apply `Schemafile`
...
-- add_column("dept_manager", "to_date2", :date, {:null=>false, :after=>"from_date"})
(42.2ms) ALTER TABLE `dept_manager` ADD `to_date2` date NOT NULL AFTER `from_date`,LOCK=NONE
-> 0.0428s
-- remove_column("dept_manager", "to_date")
(46.9ms) ALTER TABLE `dept_manager` DROP `to_date`,LOCK=NONE
-> 0.0471s
--dump-with-default-fk-name / fk apply order
外部キーに関して二点ほど。
Railsでadd_foreign_keyを実行したとき、名前をつけないと自動的にfk_rails_e74ce85cbc
みたいな名前がつけられるんですよね。
ただ、この名前だと、スキーマをダンプしたときにname: が出力されない…
ridgepole的には外部キーに名前ついていないと困るので、--dump-with-default-fk-name
オプションで強制的にダンプできるようにしました。
あと、外部キーに関してはテーブルの作成順を考慮しないとエラーになる問題があったのですが、どういう定義順であっても、まずテーブルの作成を行ってから、外部キーを張るように修正しました。
Support t.index
/ Remove alias_method_chain
プルリクをいただきまして、
t.index
がサポートされて、alias_method_chainが削除されました。
Rails5対応への足がかりができて、ありがたいことです。
また、それに付随して、migration_commentsのサポートを切りました。
migration_commentsについては対応状況が微妙だったのと、prependとalias_method_chainが同居する状況は避けたかったので、外した感じです。
今後も追加はないかなぁ…
次バージョンついて
とりあえず、以下を進めていきたいなぁ…と考えています。
- Rails5サポート
- MySQL 5.7サポート
- 可能ならViewのサポート