Dartマイグレーションツール構想

欲しい機能

  • モデルのリビジョン作成
  • データ移行関数(dryrun あり)

流れ

  1. path/to/models/ から @Migratable() がついたモデルを path/to/migrations/ または model.migration.dart にコピー
  2. 移動したモデルをリネーム (User -> UserV2)
  3. マイグレータに一つ前から最新のモデルへの変換ヘルパー関数が実装される

最新のモデル

part of 'user.g.dart';
 
@Migratable(prev: 'v3')
class User {
  String name;
 
  factory fromV2(UserV2 user) {
    throw NotImplementedException();
  }
}

マイグレータ

  • どれかのスキーマが1ミリでも変わるとバージョンが上がる :thinking_face:
  • バージョン間でモデル同士が独立しているわけではないので, 一つ前のバージョンからのデータ移行関数を生成.
  • 特定のバージョンから最新バージョンにデータ移行するためには連鎖的にマイグレーションする
  • 一つ前のバージョンからデータを取得 -> 変換関数を使って新しいデータに変換
class SchemaVersion {
  static const v0 = 'v0';
  static const v1 = 'v1';
}
 
class Migrator {
  Future<void> _migrateFromV0ToV1() {...}
 
  Future<void> _migrateFromV1ToV2() {...}
 
  Future<void> migrate(String currentVersion) {
 
  }
}