- 実行言語に依存しない定義(JSON, SQL)
- up, down, バージョン指定
- シャーディング対応(同一DB名、同一テーブル名)
- 同時に追加しようとした場合にコンフリクトさせる
- 未定義の場合はエラーにする
- 1つのバージョンはトランザクションで実行する、失敗した場合はロールバック
generateコマンドでファイルを生成する際にファイル名にタイムスタンプを付加するのが一般的だが、 それだと複数ブランチで生成した場合に順番が保証されない。 コンフリクトさせるなどして順番を保証する。 バージョンの管理と定義を分けることにより実現。
- 想定と異なるテーブルが存在していた場合に気付きにくいので
IF [NOT] EXISTS
はなるべく書かない
- フレームワーク毎に異なる構文ではなくSQLで直接書ける no more huge document.
- RDBMSの違いによるSQLの差異を吸収できない → 途中で変更することはほとんどないと思われるので影響は少ない
migrator help
migrator status # バージョン一覧+現在のバージョン
migrator version # 現在のバージョン
migrator migrate
migrator rollback --step=1
migration-helper generate down [path]
{
"db1": {
"driver": "mysql"
"host": localhost,
"db": "db1",
"user": "root",
"pass": "root"
},
"db2": {
"dns": "mysql:host=localhost;dbname=db2",
"user": "root",
"pass": "root"
}
}
[
{
"db": "db1",
"up": "001/table1.up.sql",
"down": "001/table1.down.sql"
},
{
"db": ["db1", "db2"],
"up": "001/*.up.sql",
"down": "001/*.down.sql"
}
]
- CREATE文だけ定義してALTERを差分から自動生成、差分はGitなどから取得できるとなお良い
- パーティションの管理
- データベースの作成、ユーザーの作成などテーブルのマイグレーション以外も含める?
- DBマイグレーションツールを比較した phpmig, migrate, goose https://qiita.com/hypermkt/items/e48ca78f626faf23b41a
- DBスキーマもバージョン管理したい! https://www.slideshare.net/kwatch/db-28097225