2016-02-29 86 views
0

我正在重構Flask應用程序以使用藍圖和應用程序工廠。我已閱讀使用應用程序工廠的文檔:Application Factories。但是,文檔似乎是手動創建模型。我想反映現有數據庫中的表格。我在反映發動機出現以下錯誤:使用應用程序工廠時反映數據庫引擎

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

我打電話db.init_app(app),然後使用應用程序上下文,調用create_all創建我的模型。在這一點上,應用程序現在沒有數據庫引擎,它不是綁定到瓶子應用程序對象嗎?

__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'] 

***** UPDATE *****

我已經更新了應用程序以反映應用程序上下文中的引擎。

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

不過,現在我對我的表接收鍵錯誤:

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

您在應用上下文中未調用「反射」,因此當然它會抱怨說您不在應用上下文。您在上下文中調用了'create_all',對'reflect'執行相同的操作。 – davidism

+0

你是對的。我沒有在上下文中調用反射。但是,現在我的桌子上出現keyError了。我已更新我的問題 – Jimmy

+0

請[edit]創建[mcve]。 – davidism

回答

0

我已經同型號的進口造成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()) 
相關問題