MigrateSchema runs ~10 individual HasColumn queries plus table existence checks on every startup. For a database that's already fully migrated, this is wasted work.
A migrations table that records which migrations have been applied would let startup skip straight past checks it's already done. Each migration gets a name and a timestamp. On boot, load the set of applied migrations, only run the ones that are new.
This also sets up a cleaner path for future schema changes than the current column-by-column approach.