2016-03-31 2 views
2

У меня есть база данных SQLite для управления входами пользователей вместе с существующей базой данных MySQL. Я добавил базу данных MySQL в конфигурацию Flask-SQLAlchemy SQLALCHEMY_BINDS. Когда я пытаюсь отразить таблицы, я получаю следующую ошибку:Отражение таблиц с Flask-SQLAlchemy повышает RuntimeError: приложение не зарегистрировано

RuntimeError: application not registered on db instance and no application bound to current context 

Как правильно отразить таблицы?

__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 

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() 

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 
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 

ответ

1

Вы не можете выполнять операции над базой данных до тех пор, пока расширение не будет инициализировано приложением, что не произойдет, пока не будет использована функция фабрики приложений. Переместите звонок 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 

Поскольку модели импортируются как часть представлений, которые только ввезенных внутри завода, метаданные будут содержать отраженные таблицы по времени определены модели.

+0

Боюсь, что у меня что-то не хватает. Он не работает даже с 'db.reflect (app = app)'. Обратите внимание, что я использую Flask-Migrate и Alembic. – Galil

+0

Хотя я добавил 'db.reflect (app = app)' Я получаю ту же ошибку, что и раньше. Что еще вы думаете, что я мог бы добавить? – Galil

+0

Я отправил всю трассу. Благодаря! – Galil

Смежные вопросы