Flask migrations with alembic without flask-migrate

The starting point for this setup was, that I wanted to be able to automigrate and to be able to move my models in a folder. And since flask-migrate is using a manager I opted out of that and used plain alembic with flask-sqlalchemy.

So, this is my Flask setup:

      ... the models ...
      ... versions/ and rest of alembic ...

So where is the magic happening?
Actually (spoilers!) there is no magic. Maybe I’m just a little daft, for not getting this right sooner. So here is what I do
In my shared_model.py I put my db declaration like this

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

and the rest of the code I like to use in all models.

In my app.py I initialize my app via function

from flask import Flask
app = Flask(__name__)

def start_app():
      ... configuration magic ...
      return app

if __name__ == "__main__":
      app = start_app()

Finally the adjustments in alembic/env.py somewhere underneath the MetaData

from start import start_app
app = start_app()
from models.shared_model import db
config.set_main_option("sqlalchemy.url", app.config["SQLALCHEMY_DATABASE_URI"])
target_metadata = db.metadata

An that’s it. Blueprints, autogenerate and all the fancies 🙂