gpt4 book ai didi

python - 使用 Flask-SQLAlchemy 反射(reflect)表引发 RuntimeError : application not registered

转载 作者:太空狗 更新时间:2023-10-30 02:57:38 24 4
gpt4 key购买 nike

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

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

如何正确反射(reflect)表格?

__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

管理.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

最佳答案

在使用应用程序初始化扩展之前,您不能对数据库执行操作,这在使用应用程序工厂功能之前不会发生。将 reflect 调用移到工厂内部,并使用 db.reflect,它反射(reflect)了 所有 绑定(bind),而不仅仅是主要绑定(bind)。

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

由于模型是作为 View 的一部分导入的, View 仅在工厂内部导入,因此元数据将在定义模型时包含反射(reflect)的表。

关于python - 使用 Flask-SQLAlchemy 反射(reflect)表引发 RuntimeError : application not registered,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36337416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com