Or you inherit a DB that’s a complete disaster scheme wise and all the nice assumptions go out the window.
I’ve mostly found that migrations work best as a structure way to just run normal SQL and know a) what ran b) when.
For that they are handy.
I’ve even considered how to structure a stand alone migration running tool with a nice API since the good ones for each language tend to be fairly different.
It annoys me that the tooling around RDBMS in 2019 is still so shit.
Prime example, try to find a halfway reasonable way to debug a badly written MySQL sproc you inherited.