【Flutter】
データベースのマイグレーションを行って新しいバージョンのアプリにテーブルを追加する方法

sqfliteでのマイグレーション方法

投稿日 2026/03/05 更新日 2026/03/05


こんにちは。IT業界歴6年目の「元木皇天」です。

先日、私がリリースしたFlutter製のアプリで、新バージョンの開発中に新しいテーブルを作る必要がありました。

ということで、今回はFlutterで使用しているsqfliteを使用してDBのマイグレーションを行う方法について解説いたします。

ちなみに、同様の方法でカラムの追加やテーブルの削除などもできます。

やりたいこと

sqfliteでデータベースのマイグレーションを行い、新テーブルを追加する


参考文献

sqflite - migration example


環境

・OS:MacOS Sequoia 15.6
・Flutter:Ver 3.35.6
・sqflite:Ver 2.4.2

sqfliteでマイグレーション

まず初めに、マイグレーション前のコードを紹介します。(私のアプリでは、DatabaseHelperクラスでDBの作成などの処理を担っています)

class DatabaseHelper {
  static final DatabaseHelper instance = DatabaseHelper._();
  static Database? _database;

  DatabaseHelper._();

  Future get database async {
    return _database ??= await _initDatabase();
  }

  Future _initDatabase() async {
    var path = join(await getDatabasesPath(), "sample.db");
    return await openDatabase(
      join(path, "sample.db"),
      version: 1,
      onCreate: (Database db, int version) async {
        await db.execute(/* do something */);
      }
    );
  }
}

続いて、このコードにマイグレーションの処理を書き足したものを紹介します。

class DatabaseHelper {
  static final DatabaseHelper instance = DatabaseHelper._();
  static Database? _database;

  DatabaseHelper._();

  Future get database async {
    return _database ??= await _initDatabase();
  }

  Future _initDatabase() async {
    var path = join(await getDatabasesPath(), "sample.db");
    return await openDatabase(
      join(path, "sample.db"),
      version: 2,
      onCreate: (Database db, int version) async {
        await db.execute(/* do something */);
        await db.execute(/* do something ver2 */);
      },
      onUpgrade: (Database db, int oldVersion, int newVersion) async {
        if (oldVersion < 2) {
          await db.execute(/* do something ver2 */);
        }
      },
    );
  }
}

コードの解説

※先ほどのコードだけで伝わった方は、これより先は読まなくて大丈夫です。


マイグレーションを行う際に、ポイントとなるのは以下の点です。

  1. openDatabase()の引数のversionの値をインクリメントする。
  2. onUpgrade()でマイグレーションの内容を指定する。
  3. onCreate()に必要に応じてマイグレーションした結果と同じになるような処理を指定する。

まず「1」について。

マイグレーションの管理をするために、openDatabase()の引数であるversionの値をインクリメントします。

これに関しては特に説明不要ですね(笑)


次に「2」について。

データベースのマイグレーション処理は、onUpgrade()で指定します。

ここに、テーブルの新規作成処理や、カラムの追加処理などを記載します。

なお、条件に「if (oldVersion < 2)」を指定していますが、これは現在のデータベースのバージョンが「1」だった場合に実行されるようにしています。

今後もバージョンを上げる場合に「if (oldVersion < 3)」のように記載すれば、バージョンを1から3に上げた場合にも対応できるのでこのような記載にしております。


最後「3」について。

こちらは意外と忘れやすいのですが、onCreate()にマイグレーションの内容を含んだ実行内容を記載します。

DBバージョンが1の時から使用しているユーザもいれば、新規ユーザでバージョン2から使用し始める場合もあります。

その時に、onCreateの結果が、マイグレーション結果と同じ状態にならない場合、不整合が発生してしまいます。

忘れずに記載しましょう!!

まとめ

sqfliteでデータベースのマイグレーション(migration)するには、onUpgradeを使用する。

参考文献・おすすめ文献

sqflite - migration example