reset method

  1. @override
Future reset()
override

Implementation

@override
Future reset() async {
  await _init();
  var result = await connection
      .execute('SELECT path from migrations ORDER BY batch DESC;');

  // "mysql_client" driver will auto convert path containing "\\" to "\".
  // So need to revert "\" back to "\\" for the migration logic to work
  var existing = <String>[];
  for (var item in result.rows) {
    var rec = item.assoc().values.first ?? "";
    existing.add(rec.replaceAll("\\", "\\\\"));
  }

  var toRun = existing.where(migrations.containsKey).toList();

  if (toRun.isNotEmpty) {
    for (var k in toRun.reversed) {
      var migration = migrations[k]!;
      var schema = MySqlSchema();
      migration.down(schema);
      _log.info('Removed "$k" from "migrations" table.');
      await schema.run(connection).then((_) {
        return connection
            .execute('DELETE FROM migrations WHERE path = \'$k\';');
      });
    }
  } else {
    _log.warning('Nothing to remove from "migrations" table.');
  }
}