我尝试创建一个系统,其模型可以在烧瓶的应用程序上下文和外部作业中使用。 我创建了一个带有以下内容的database.py:
from sqlalchemy import MetaData, Column, Integer, String, Float, DateTime
from sqlalchemy.ext.declarative import declarative_base
metadata = MetaData()
Base = declarative_base(metadata=metadata)
class Stock(Base):
__tablename__ = 'Stock'
id = Column(Integer, primary_key=True)
ticker = Column(String(10), nullable=False)
time_stamp = Column(DateTime, nullable=False)
open = Column(Float, nullable=False)
high = Column(Float, nullable=False)
low = Column(Float, nullable=False)
close = Column(Float, nullable=False)
volume = Column(Integer, nullable=False)
price = Column(Float, nullable=True)
我还创建了一个flask_db.py文件:
from flask_sqlalchemy import SQLAlchemy
from database import metadata
db = SQLAlchemy(metadata=metadata)
然后在我的app.py
中使用它from flask import Flask, render_template
from flask_db import db
import os
# create the flask app
app = Flask(__name__, template_folder="dist/", static_folder="dist/", static_url_path="")
# config
app.config.from_object(os.environ['APP_SETTINGS'])
# initialise db
db.init_app(app)
@app.route("/")
def index():
"""
renders basic index page
:return: template
"""
return render_template("index.html")
# app entry point
if __name__ == "__main__":
app.run()
当我运行名为create_db.py的文件时:
from flask_db import db
db.create_all()
我收到以下错误:
RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.
我不确定为什么没有找到应用程序。
答案 0 :(得分:1)
只有在调用init_app
时才会初始化db扩展,并且只有在运行应用程序时才会创建应用程序上下文。但是因为你要从flask_db模块导入,所以这些都不会发生 - 应用程序模块中的代码永远不会被Python解释器运行。
你可能需要做的是这样的事情:
```python
from app import app, db
app_ctx = app.app_context()
ctx.push()
db.create_all()
ctx.pop()
```
我认为这应该有效。但我强烈建议您考虑使用application factory pattern创建您的应用,并使用click commands(使用with_appcontext
装饰器)添加到Flask的cli界面,而不是使用一次性脚本。此外,使用Flask-Migrate进行正确的数据库迁移可能值得。
编辑:在您的应用模块中,您可能还需要告诉Flask-SQLAlchemy您的自定义基本模型:
```
db = SQLAlchemy(metadata=metadata, model_class=Base)
```