Изглежда, че sqlalchemy.migrate няма поддръжка за рендиране на валидна заявка в случай на промяна от типове колони String на Integer за postgresql.
Във вашия случай бих го приложил като директно изпълнение на заявка и бих продължил.
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')
Между другото мигрирането от String към Integer може да се провали по различни причини - когато стойността на колоната би съдържала някаква стойност, която не може да бъде преобразувана в число. Така че бих добавил допълнително валидиране в логиката на приложението, за да запазя възможна миграция към по-ниска версия по-късно.