Vypadá to, že sqlalchemy.migrate nemá podporu pro vykreslování platného dotazu v případě změny typu sloupců String na Integer pro postgresql.
Ve vašem případě bych to implementoval jako přímé provádění dotazu a pokračoval.
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 migrace z String na Integer může selhat z různých důvodů – když by hodnota sloupce obsahovala nějakou hodnotu, kterou nelze převést na číslo. Takže bych přidal nějaké další ověření do aplikační logiky, aby byla později možná migrace na nižší verzi.