I'd like to use Flask's application factory mechanism fpr my application. I have is that the databases I use within some blueprints are located differently, so I'm using binds for pointing to them. The tables itself are in production and already in use, so I need to reflect them in order to use them within my application.
Problem is that I can't get the reflect function working because of the application context. I always get the message, that I'm working outside the application context. I fully understand that and see, that db is really outside, but don't have any idea anymore on how to involve it.
I tried different variations on passing app via current_app to my models.py, but nothing was working.
config.py:
class Config(object):
    #Secret key
    SECRET_KEY = 'my_very_secret_key'
    ITEMS_PER_PAGE = 25
    SQLALCHEMY_BINDS = {
        'mysql_bind': 'mysql+mysqlconnector://localhost:3306/tmpdb'
    }
    SQLALCHEMY_TRACK_MODIFICATIONS = False
main.py:
from webapp import create_app
app = create_app('config.Config')
if __name__ == '__main__':
    app.run(debug=true)
webapp/init.py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config_object):
    app=Flask(__name__)
    app.config.from_object(config_object)
    db.init_app(app)
    from main import create_module as main_create_module
    main_create_module(app)
    return app
webapp/main/init.py:
def create_module(app):
    from .controller import blueprint
    app.register(blueprint)
webapp/main/controller.py:
from flask import Blueprint, render_template, current_app as app
from .models import db, MyTable # <-- Problem might be here ...
bluerint = Blueprint('main', __name__)
@blueprint.route('/'):
def index():
    resp = db.session.query(MyTable)\
            .db.func.count(MyTable.versions)\
            .filter(MyTable.versions =! '')\
            .group_by(MyTable.name).all()
    if resp:
        return render_template('index.html', respo=respo)
    else:
        return 'Nothing happend'
webapp/main/models.py:
from .. import db # <-- and here ...
db.reflect(bind='mysql_bind')
class MyTable(db.Model):
    __bind_key__ = 'mysql_bind'
    __table__ = db.metadata.tables['my_table']
Expected result would be to get the reflection working in different blueprints.
db.init_app(app)is the same asdb = SQLAlchemy(app). In the example I described it would not make a difference since the db object would not be callable inmodels.pyeither way, it's only available using Flask and SQLAlchemy without factory setup (you called it "vanilla SQLAlchemy").create_appinwebapp/__init__.pyand initialize db already at import time. Thus it makes less headache. Good, old, plain "vanilla Flask". :)create_app()after the linedb.init_app(app)includedb.reflect(app=app).