読者です 読者をやめる 読者になる 読者になる

Ridgepole v0.6.4

業務でも使ってみて問題なさそうな感じなので 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
#!/bin/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-extraMySQLの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サポート
    • 特にJSONカラムと生成カラム
  • 可能ならViewのサポート
    • MySQLでうまい手が見つからないのですが…