使用 Flask-SQLAlchemy 反射表会引发 RuntimeError:应用程序未注册

Gal*_*lil 4 python sqlalchemy flask flask-sqlalchemy

我有一个 SQLite 数据库来管理用户登录,以及一个现有的 MySQL 数据库。我将 MySQL 数据库添加到 Flask-SQLAlchemySQLALCHEMY_BINDS配置中。当我尝试反映表格时,出现以下错误:

RuntimeError: application not registered on db instance and no application bound to current context
Run Code Online (Sandbox Code Playgroud)

如何正确反映表格?

__init__.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
Run Code Online (Sandbox Code Playgroud)

manage.py

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()
Run Code Online (Sandbox Code Playgroud)

models.py

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
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
  File "./manage.py", line 6, in <module>
    from app.models import User, Role, Permission
  File "/home/ilias/Desktop/client-reporting/app/models.py", line 9, in <module>
    db.Model.metadata.reflect(db.engine)
  File "/home/ilias/Desktop/client-reporting/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 780, in engine
    return self.get_engine(self.get_app())
  File "/home/ilias/Desktop/client-reporting/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 809, in get_app
    raise RuntimeError('application not registered on db '
RuntimeError: application not registered on db instance and no application bound to current context
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 5

在使用应用程序初始化扩展程序之前,您无法对数据库执行操作,这在使用应用程序工厂函数之前不会发生。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
Run Code Online (Sandbox Code Playgroud)

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