【问题标题】:Reflect db engine when using Application factory使用应用程序工厂时反映数据库引擎
【发布时间】:2016-02-29 20:48:40
【问题描述】:

我正在重构一个 Flask 应用程序以使用蓝图和应用程序工厂。我已经阅读了使用应用程序工厂的文档:Application Factories。但是,文档似乎是手动创建模型。我想反映现有数据库中的表。反映引擎时出现以下错误:

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

我正在调用db.init_app(app),然后使用应用程序上下文,调用create_all 来创建我的模型。到这里,应用现在不是有db引擎了吗,不是绑定到flask app对象了吗?

__init__.py:

from database import db
from flask import Flask

def create_app(config_file):
    app = Flask(__name__)
    app.config.from_pyfile(config_file)

    db.init_app(app)
    with app.app_context():
        db.create_all()

    return app

database.py:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

models.py:

from database import db

class Trailer(db.Model):
    __table__ = db.Model.metadata.tables['tr_trailer']

*****更新*****

我已更新应用程序以在应用程序上下文中反映引擎。

with app.app_context():
        db.Model.metadata.reflect(db.engine)
        db.create_all()

但是,现在我的桌子上出现了关键错误:

__table__ = db.Model.metadata.tables['tr_trailer']
KeyError: 'tr_trailer'

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我在导入模型时遇到了同样的问题,导致 KeyError。我已将模型的导入延迟到我在视图函数中需要它的位置 -

    @blueprint.route('/some_route', method('GET','POST')
    def some_route():
      from blueprint.path.models import TabObj
      return str(db.session.query(db.func.count(TabObj.colname)).scalar())
    

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多