Sieht so aus, als hätte sqlalchemy.migrate keine Unterstützung für das Rendern gültiger Abfragen, wenn für postgresql von String- zu Integer-Spaltentypen gewechselt wird.
In Ihrem Fall würde ich es als direkte Abfrageausführung implementieren und weitermachen.
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')
Übrigens kann die Migration von String zu Integer aus verschiedenen Gründen fehlschlagen - wenn der Spaltenwert einen Wert enthalten würde, der nicht in eine Zahl konvertiert werden kann. Daher würde ich der Anwendungslogik eine zusätzliche Validierung hinzufügen, um eine spätere Downgrade-Migration zu ermöglichen.