Migrate a database as needed.

        This method is safe to call on an up-to-date database, on an old
        database, on a newer database, or an uninitialized database
        (version 0).

        This method is idempotent.

def migrate(self, conn):
        """Migrate a database as needed.

        This method is safe to call on an up-to-date database, on an old
        database, on a newer database, or an uninitialized database
        (version 0).

        This method is idempotent.
        """
        while self.should_migrate(conn):
            current_version = get_user_version(conn)
            migration = self._get_migration(current_version)
            assert migration.from_ver == current_version
            logger.info(f'Migrating database from {migration.from_ver}'
                        f' to {migration.to_ver}')
            self._migrate_single(conn, migration)
            set_user_version(conn, migration.to_ver)
            logger.info(f'Migrated database to {migration.to_ver}')