Wygląda na to, że sqlalchemy.migrate nie obsługuje renderowania prawidłowego zapytania w przypadku zmiany typów kolumn typu String na Integer dla postgresql.
W twoim przypadku zaimplementowałbym to jako bezpośrednie wykonanie zapytania i ruszyłem dalej.
def downgrade(migrate_engine):
# ALTER TABLE courses ALTER COLUMN number SET DATA TYPE integer;
migrate_engine.execute('ALTER TABLE courses ALTER COLUMN number TYPE INTEGER USING number::numeric')
BTW migracja z String do Integer może się nie powieść z różnych powodów - gdy wartość kolumny zawierałaby jakąś wartość, której nie można przekonwertować na liczbę. Dodałbym więc trochę dodatkowej walidacji do logiki aplikacji, aby umożliwić późniejszą migrację do niższej wersji.