Python 使用Flask SQLAlchemy反射表会引发运行时错误:应用程序未注册

Python 使用Flask SQLAlchemy反射表会引发运行时错误:应用程序未注册,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我有一个SQLite数据库来管理用户登录,还有一个现有的MySQL数据库。我将MySQL数据库添加到Flask SQLAlchemySQLAlchemy\u绑定config。当我试图反映这些表时,会出现以下错误: RuntimeError: application not registered on db instance and no application bound to current context 如何正确反映表格 \uuuu init\uuuuu.py: from flask i

我有一个SQLite数据库来管理用户登录,还有一个现有的MySQL数据库。我将MySQL数据库添加到Flask SQLAlchemy
SQLAlchemy\u绑定
config。当我试图反映这些表时,会出现以下错误:

RuntimeError: application not registered on db instance and no application bound to current context
如何正确反映表格

\uuuu init\uuuuu.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from config import config

db = SQLAlchemy()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    db.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app
from myapp import create_app
from flask.ext.migrate import Migrate, MigrateCommand

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()
from . import db, login_manager

db.Model.metadata.reflect(db.engine)

class Calls(db.Model):
    __table__ = db.Model.metadata.tables['Calls2']
    __bind_key__ = 'calls'

    def __repr__(self):
        return self.test1
manage.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from config import config

db = SQLAlchemy()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    db.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app
from myapp import create_app
from flask.ext.migrate import Migrate, MigrateCommand

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()
from . import db, login_manager

db.Model.metadata.reflect(db.engine)

class Calls(db.Model):
    __table__ = db.Model.metadata.tables['Calls2']
    __bind_key__ = 'calls'

    def __repr__(self):
        return self.test1
models.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from config import config

db = SQLAlchemy()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    db.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app
from myapp import create_app
from flask.ext.migrate import Migrate, MigrateCommand

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()
from . import db, login_manager

db.Model.metadata.reflect(db.engine)

class Calls(db.Model):
    __table__ = db.Model.metadata.tables['Calls2']
    __bind_key__ = 'calls'

    def __repr__(self):
        return self.test1
回溯(最近一次呼叫最后一次):
文件“/manage.py”,第6行,在
从app.models导入用户、角色、权限
文件“/home/ilias/Desktop/client reporting/app/models.py”,第9行,在
db.Model.metadata.reflect(db.engine)
文件“/home/ilias/Desktop/client reporting/local/lib/python2.7/site packages/flask\u sqlalchemy/\u_init\u_.py”,第780行,在引擎中
返回self.get\u引擎(self.get\u应用程序())
文件“/home/ilias/Desktop/client reporting/local/lib/python2.7/site packages/flask\u sqlalchemy/\u_init\u_.py”,第809行,在get\u应用程序中
raise RUNTIMERROR('应用程序未在数据库上注册'
RuntimeError:应用程序未在db实例上注册,并且没有绑定到当前上下文的应用程序

在应用程序初始化扩展之前,您无法对数据库执行操作,这在使用应用程序工厂功能之前是不会发生的。将
reflect
调用移动到工厂内,然后使用
db.reflect
,它反映所有绑定,而不仅仅是主绑定

def create_app():
    app = Flask(__name__)
    ...

    db.init_app(app)
    db.reflect(app=app)
    # you could also push an app context instead of passing app
    # with app.app_context():
    #     db.reflect()

    ...
    return app
由于模型作为视图的一部分导入,而视图仅在工厂内部导入,因此在定义模型时,元数据将包含反映的表