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