簡體   English   中英

Flask和SQLAlchemy,應用程序未在實例上注冊

[英]Flask and SQLAlchemy, application not registered on instance

我正在嘗試拼湊一個小型Flask應用程序。 這是我的結構。

run.py
application
  __init__.py
  database.py
  models.py
  views.py

database.py只包含SQLAlchemy對象:

db = SQLAlchemy()

然后我將其導入到models.py以創建我的模型。 最后,在__init__.py我從database.py導入db並執行:

from .database import db
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///application.db'
db.init_app(app)
db.create_all()

但是,我無法從它出現的模型中創建表。 如果我刪除db.create_all() 應用程序將運行沒有問題,但顯然沒有創建數據庫。 db.create_all()存在時,我得到'RuntimeError:應用程序未在db實例上注冊,並且沒有應用程序綁定到當前上下文'。

老實說我很困惑,就像之前我在沒有創建數據庫的情況下啟動應用程序時出現問題一樣,但將db移動到它自己的文件似乎已經在某種程度上糾正了這個問題。 現在,唯一的問題仍然是創建數據庫。

誰能告訴我可能是什么問題? 我真的很難過。

答案在這里: http//flask-sqlalchemy.pocoo.org/latest/api/#configuration

請參閱以下部分:

兩者之間的區別在於,在第一種情況下,create_all()和drop_all()等方法將一直有效,但在第二種情況下,必須存在flask.Flask.request_context()。

這里有更多信息: http//flask-sqlalchemy.pocoo.org/latest/contexts/

如果所有這一切都令人困惑(可能是因為它正在討論Flask的一個相當高級的功能),那么簡短的短版本是db.init_app(app)更改app對象,但它不會改變db對象中的任何內容。 這是有目的的,因為可能有不止一個app飛來飛去, db可能不得不與所有人交談。 (我說這是一個高級功能。)

因此,當您在沒有實時請求(創建具有當前正在運行的app的全局db.create_all()情況下調用db.create_all() ,它不知道要連接到什么,以及炸彈。 這就是錯誤的含義。

在你的情況下,我會將SQLAlchemy調用回__init__.py並將app傳遞給它,這是最簡單的方法:

db = SQLAlchemy(app)

或保持原樣,並在第一次請求之前運行設置:

@app.before_first_request
def create_database():
     db.create_all()

我希望有所幫助! 如果您遇到更多問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM